Initial implementation of the new ShowWidget.

This commit is contained in:
Jordan Petridis 2017-12-15 18:42:49 +02:00
parent 4b0a6ea0f7
commit c74153f56a
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
3 changed files with 147 additions and 177 deletions

View File

@ -2,191 +2,156 @@
<!-- Generated with glade 3.20.2 --> <!-- Generated with glade 3.20.2 -->
<interface domain="gnome-music"> <interface domain="gnome-music">
<requires lib="gtk+" version="3.12"/> <requires lib="gtk+" version="3.12"/>
<object class="GtkBox" id="podcast_widget"> <object class="GtkBox" id="container">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child> <child>
<object class="GtkBox"> <object class="GtkScrolledWindow">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">True</property>
<property name="halign">center</property> <property name="shadow_type">in</property>
<property name="valign">center</property>
<property name="margin_left">32</property>
<property name="margin_right">32</property>
<property name="margin_start">32</property>
<property name="margin_end">32</property>
<property name="margin_top">64</property>
<property name="margin_bottom">32</property>
<child> <child>
<object class="GtkBox"> <object class="GtkViewport">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<property name="spacing">15</property>
<child>
<object class="GtkImage" id="cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">start</property>
<property name="margin_left">1</property>
<property name="margin_right">1</property>
<property name="margin_start">1</property>
<property name="margin_end">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">center</property> <property name="orientation">vertical</property>
<property name="valign">center</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">center</property> <property name="valign">center</property>
<child> <child>
<object class="GtkLabel" id="title_label"> <object class="GtkImage" id="cover">
<property name="width_request">50</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixel_size">128</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">center</property> <property name="halign">center</property>
<property name="label" translatable="yes">Foobar</property> <property name="valign">center</property>
<property name="use_markup">True</property> <property name="orientation">vertical</property>
<property name="justify">center</property> <child>
<property name="wrap">True</property> <object class="GtkLabel" id="description">
<property name="max_width_chars">28</property> <property name="visible">True</property>
<property name="track_visited_links">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">The people behind The Intercepts fearless reporting and incisive commentary—Jeremy Scahill, Glenn Greenwald, Betsy Reed and others—discuss the crucial issues of our time: national security, civil liberties, foreign policy, and criminal justice. Plus interviews with artists, thinkers, and newsmakers who challenge our preconceptions about the world we live in.</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="settings_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">emblem-system-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="link_button">
<property name="label" translatable="yes">Website</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="unsub_button">
<property name="label" translatable="yes">Unsubscribe</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="pack_type">end</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="padding">5</property>
<property name="position">1</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="padding">5</property> <property name="padding">10</property>
<property name="position">1</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="unsub_button"> <object class="GtkBox" id="episodes">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">False</property>
<property name="receives_default">True</property> <property name="orientation">vertical</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child> <child>
<object class="GtkImage"> <placeholder/>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Unsubrscribe from this Podcast.
Warn: This will delete downloaded content associated with this Podcast.</property>
<property name="icon_name">user-trash-symbolic</property>
</object>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">True</property>
<property name="fill">False</property> <property name="fill">True</property>
<property name="padding">5</property>
<property name="pack_type">end</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkButton" id="mark_all_played_button">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Mark all episodes as Played.</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">object-select-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<property name="min_content_width">200</property>
<property name="max_content_width">200</property>
<property name="propagate_natural_width">True</property>
<property name="propagate_natural_height">True</property>
<child>
<object class="GtkTextView" id="desc_text_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="wrap_mode">word-char</property>
<property name="cursor_visible">False</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="hscrollbar_policy">never</property>
<child>
<object class="GtkViewport" id="view">
<property name="width_request">400</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<child>
<placeholder/>
</child> </child>
</object> </object>
</child> </child>
@ -194,7 +159,7 @@ Warn: This will delete downloaded content associated with this Podcast.</propert
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">2</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
</object> </object>

View File

@ -70,6 +70,11 @@ pub fn get_pixbuf_from_path(pd: &Podcast) -> Option<Pixbuf> {
Pixbuf::new_from_file_at_scale(&img_path, 256, 256, true).ok() Pixbuf::new_from_file_at_scale(&img_path, 256, 256, true).ok()
} }
pub fn get_pixbuf_from_path_128(pd: &Podcast) -> Option<Pixbuf> {
let img_path = downloader::cache_image(pd)?;
Pixbuf::new_from_file_at_scale(&img_path, 128, 128, true).ok()
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use hammond_data::Source; use hammond_data::Source;

View File

@ -9,7 +9,7 @@ use hammond_data::Podcast;
use hammond_downloader::downloader; use hammond_downloader::downloader;
use widgets::episode::episodes_listbox; use widgets::episode::episodes_listbox;
use utils::get_pixbuf_from_path; use utils::get_pixbuf_from_path_128;
use content::ShowStack; use content::ShowStack;
use headerbar::Header; use headerbar::Header;
@ -19,34 +19,38 @@ use std::rc::Rc;
pub struct ShowWidget { pub struct ShowWidget {
pub container: gtk::Box, pub container: gtk::Box,
cover: gtk::Image, cover: gtk::Image,
title: gtk::Label, description: gtk::Label,
description: gtk::TextView, link: gtk::Button,
view: gtk::Viewport, settings: gtk::Button,
unsub: gtk::Button, unsub: gtk::Button,
played: gtk::Button, episodes: gtk::Box,
} }
impl ShowWidget { impl ShowWidget {
pub fn new() -> ShowWidget { pub fn new() -> ShowWidget {
// Adapted from gnome-music AlbumWidget // Adapted from gnome-music AlbumWidget
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui"); let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui");
let container: gtk::Box = builder.get_object("podcast_widget").unwrap(); let container: gtk::Box = builder.get_object("container").unwrap();
let episodes: gtk::Box = builder.get_object("episodes").unwrap();
let cover: gtk::Image = builder.get_object("cover").unwrap(); let cover: gtk::Image = builder.get_object("cover").unwrap();
let title: gtk::Label = builder.get_object("title_label").unwrap(); let description: gtk::Label = builder.get_object("description").unwrap();
let description: gtk::TextView = builder.get_object("desc_text_view").unwrap();
let view: gtk::Viewport = builder.get_object("view").unwrap();
let unsub: gtk::Button = builder.get_object("unsub_button").unwrap(); let unsub: gtk::Button = builder.get_object("unsub_button").unwrap();
let played: gtk::Button = builder.get_object("mark_all_played_button").unwrap(); let link: gtk::Button = builder.get_object("link_button").unwrap();
let settings: gtk::Button = builder.get_object("settings_button").unwrap();
unsub
.get_style_context()
.map(|c| c.add_class("destructive-action"));
ShowWidget { ShowWidget {
container, container,
cover, cover,
title,
description, description,
view,
unsub, unsub,
played, link,
settings,
episodes,
} }
} }
@ -65,38 +69,34 @@ impl ShowWidget {
header.switch_to_normal(); header.switch_to_normal();
})); }));
self.title.set_text(pd.title());
let listbox = episodes_listbox(pd); let listbox = episodes_listbox(pd);
if let Ok(l) = listbox { if let Ok(l) = listbox {
self.view.add(&l); self.episodes.add(&l);
} }
{ self.description.set_text(pd.description());
let buff = self.description.get_buffer().unwrap();
buff.set_text(pd.description());
}
let img = get_pixbuf_from_path(pd); let img = get_pixbuf_from_path_128(pd);
if let Some(i) = img { if let Some(i) = img {
self.cover.set_from_pixbuf(&i); self.cover.set_from_pixbuf(&i);
} }
self.played.connect_clicked(clone!(shows, pd => move |_| { // self.played.connect_clicked(clone!(shows, pd => move |_| {
on_played_button_clicked(shows.clone(), &pd); // on_played_button_clicked(shows.clone(), &pd);
})); // }));
self.show_played_button(pd); // self.show_played_button(pd);
} }
fn show_played_button(&self, pd: &Podcast) { // fn show_played_button(&self, pd: &Podcast) {
let new_episodes = dbqueries::get_pd_unplayed_episodes(pd); // let new_episodes = dbqueries::get_pd_unplayed_episodes(pd);
if let Ok(n) = new_episodes { // if let Ok(n) = new_episodes {
if !n.is_empty() { // if !n.is_empty() {
self.played.show() // self.played.show()
} // }
} // }
} // }
} }
fn on_unsub_button_clicked(shows: Rc<ShowStack>, pd: &Podcast, unsub_button: &gtk::Button) { fn on_unsub_button_clicked(shows: Rc<ShowStack>, pd: &Podcast, unsub_button: &gtk::Button) {