diff --git a/hammond-gtk/resources/gtk/headerbar.ui b/hammond-gtk/resources/gtk/headerbar.ui index 0946f21..2c53892 100644 --- a/hammond-gtk/resources/gtk/headerbar.ui +++ b/hammond-gtk/resources/gtk/headerbar.ui @@ -146,6 +146,19 @@ 1 + + + True + False + vertical + + + False + True + end + 2 + + False @@ -166,42 +179,16 @@ False 5 - - True - True - False - Add a new feed - - - True - False - gtk-add - True - 1 - - - - - - False - False - 0 - - - - + True False - center - True - 0 + vertical False True - 4 + end + 0 @@ -221,20 +208,7 @@ False False end - 2 - - - - - True - False - vertical - - - False - True - end - 3 + 1 @@ -257,8 +231,47 @@ False False end + 2 + + + + + True + True + False + Add a new feed + + + True + False + gtk-add + True + 1 + + + + + + False + False 3 + + + True + False + center + True + 0 + + + False + True + 4 + + diff --git a/hammond-gtk/src/content.rs b/hammond-gtk/src/content.rs index 4e71505..c87f88f 100644 --- a/hammond-gtk/src/content.rs +++ b/hammond-gtk/src/content.rs @@ -8,20 +8,21 @@ use views::shows::ShowsPopulated; use views::empty::EmptyView; use widgets::show::ShowWidget; +use headerbar::Header; use std::rc::Rc; #[derive(Debug, Clone)] pub struct Content { pub stack: gtk::Stack, - shows: Rc, + pub shows: Rc, episodes: Rc, } impl Content { - pub fn new() -> Rc { + pub fn new(header: Rc
) -> Rc { let stack = gtk::Stack::new(); - let shows = ShowStack::new(); + let shows = ShowStack::new(header); let episodes = EpisodeStack::new(); stack.add_titled(&episodes.stack, "episodes", "Episodes"); @@ -38,20 +39,28 @@ impl Content { self.shows.update(); self.episodes.update(); } + + pub fn get_stack(&self) -> gtk::Stack { + self.stack.clone() + } } #[derive(Debug, Clone)] pub struct ShowStack { pub stack: gtk::Stack, + header: Rc
, } impl ShowStack { - fn new() -> Rc { + fn new(header: Rc
) -> Rc { let stack = gtk::Stack::new(); - let show = Rc::new(ShowStack { stack }); + let show = Rc::new(ShowStack { + stack, + header: header.clone(), + }); - let pop = ShowsPopulated::new_initialized(show.clone()); + let pop = ShowsPopulated::new_initialized(show.clone(), header); let widget = ShowWidget::new(); let empty = EmptyView::new(); @@ -82,7 +91,7 @@ impl ShowStack { let old = self.stack.get_child_by_name("podcasts").unwrap(); let pop = ShowsPopulated::new(); - pop.init(Rc::new(self.clone())); + pop.init(Rc::new(self.clone()), self.header.clone()); self.stack.remove(&old); self.stack.add_named(&pop.container, "podcasts"); @@ -100,7 +109,7 @@ impl ShowStack { pub fn replace_widget(&self, pd: &Podcast) { let old = self.stack.get_child_by_name("widget").unwrap(); - let new = ShowWidget::new_initialized(Rc::new(self.clone()), pd); + let new = ShowWidget::new_initialized(Rc::new(self.clone()), self.header.clone(), pd); self.stack.remove(&old); self.stack.add_named(&new.container, "widget"); diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 1a8d6b4..0aa98a9 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -16,10 +16,12 @@ pub struct Header { add_toggle: gtk::MenuButton, switch: gtk::StackSwitcher, stack: gtk::Stack, + back_button: gtk::Button, + show_title: gtk::Label, } impl Header { - pub fn new() -> Header { + pub fn new() -> Rc
{ let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/headerbar.ui"); let header: gtk::HeaderBar = builder.get_object("headerbar").unwrap(); @@ -29,29 +31,40 @@ impl Header { let stack: gtk::Stack = builder.get_object("headerbar_stack").unwrap(); let normal_view: gtk::Box = builder.get_object("normal_view").unwrap(); let back_view: gtk::Box = builder.get_object("back_view").unwrap(); + let back_button: gtk::Button = builder.get_object("back_button").unwrap(); + let show_title: gtk::Label = builder.get_object("show_title").unwrap(); + + let stack = stack.clone(); + back_button.connect_clicked(clone!(stack => move |_| { + stack.set_visible_child_name("normal_view"); + })); + switch.set_halign(gtk::Align::Center); switch.show(); stack.add_named(&normal_view, "normal_view"); stack.add_named(&back_view, "back_view"); + stack.set_transition_type(gtk::StackTransitionType::Crossfade); stack.set_visible_child_name("normal_view"); - Header { + Rc::new(Header { container: header, refresh, add_toggle, switch, stack, - } + back_button, + show_title, + }) } - pub fn new_initialized(content: Rc) -> Header { - let header = Header::new(); - header.init(content); - header - } + // pub fn new_initialized(content: Rc) -> Rc
{ + // let header = Header::new(); + // header.init(content); + // header + // } - fn init(&self, content: Rc) { + pub fn init(&self, content: Rc) { let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/headerbar.ui"); let add_popover: gtk::Popover = builder.get_object("add-popover").unwrap(); @@ -73,9 +86,28 @@ impl Header { self.add_toggle.set_popover(&add_popover); // FIXME: There appears to be a memmory leak here. - self.refresh.connect_clicked(move |_| { + self.refresh.connect_clicked(clone!(content => move |_| { utils::refresh_feed(content.clone(), None, None); - }); + })); + + let stack = self.stack.clone(); + self.back_button + .connect_clicked(clone!(content => move |_| { + content.shows.stack.set_visible_child_full("podcasts", gtk::StackTransitionType::SlideLeft); + stack.set_visible_child_name("normal_view") + })); + } + + pub fn switch_to_normal(&self) { + self.stack.set_visible_child_name("normal_view") + } + + pub fn switch_to_back(&self) { + self.stack.set_visible_child_name("back_view") + } + + pub fn set_show_title(&self, title: &str) { + self.show_title.set_text(title) } } diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 77bd430..0c594b9 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -70,9 +70,13 @@ fn build_ui(app: >k::Application) { // let stack = ct.get_stack(); // let ct = content::Content::new_initialized(); - let ct = content::Content::new(); - let stack = ct.stack.clone(); - window.add(&stack); + + // Get the headerbar + let header = headerbar::Header::new(); + let ct = content::Content::new(header.clone()); + header.init(ct.clone()); + window.set_titlebar(&header.container); + window.add(&ct.get_stack()); window.connect_delete_event(|w, _| { w.destroy(); @@ -105,10 +109,6 @@ fn build_ui(app: >k::Application) { glib::Continue(false) }); - // Get the headerbar - let header = headerbar::Header::new_initialized(ct.clone()); - window.set_titlebar(&header.container); - window.show_all(); window.activate(); app.connect_activate(move |_| ()); diff --git a/hammond-gtk/src/views/shows.rs b/hammond-gtk/src/views/shows.rs index 8e7b802..affbb15 100644 --- a/hammond-gtk/src/views/shows.rs +++ b/hammond-gtk/src/views/shows.rs @@ -8,6 +8,7 @@ use hammond_data::Podcast; use utils::get_pixbuf_from_path; use content::ShowStack; +use headerbar::Header; use std::rc::Rc; @@ -43,13 +44,13 @@ impl ShowsPopulated { } #[allow(dead_code)] - pub fn new_initialized(show: Rc) -> ShowsPopulated { + pub fn new_initialized(show: Rc, header: Rc
) -> ShowsPopulated { let pop = ShowsPopulated::new(); - pop.init(show); + pop.init(show, header); pop } - pub fn init(&self, show: Rc) { + pub fn init(&self, show: Rc, header: Rc
) { use gtk::WidgetExt; // TODO: handle unwraps. @@ -61,6 +62,8 @@ impl ShowsPopulated { let pd = dbqueries::get_podcast_from_id(id).unwrap(); show.replace_widget(&pd); + header.set_show_title(pd.title()); + header.switch_to_back(); show.switch_widget_animated(); })); // Populate the flowbox with the Podcasts. diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index 1adcc3d..99da2b8 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -11,6 +11,8 @@ use hammond_downloader::downloader; use widgets::episode::episodes_listbox; use utils::get_pixbuf_from_path; use content::ShowStack; +use headerbar::Header; + use std::rc::Rc; #[derive(Debug, Clone)] @@ -48,18 +50,19 @@ impl ShowWidget { } } - pub fn new_initialized(shows: Rc, pd: &Podcast) -> ShowWidget { + pub fn new_initialized(shows: Rc, header: Rc
, pd: &Podcast) -> ShowWidget { let pdw = ShowWidget::new(); - pdw.init(shows, pd); + pdw.init(shows, header, pd); pdw } - pub fn init(&self, shows: Rc, pd: &Podcast) { + pub fn init(&self, shows: Rc, header: Rc
, pd: &Podcast) { WidgetExt::set_name(&self.container, &pd.id().to_string()); // TODO: should spawn a thread to avoid locking the UI probably. self.unsub.connect_clicked(clone!(shows, pd => move |bttn| { on_unsub_button_clicked(shows.clone(), &pd, bttn); + header.switch_to_normal(); })); self.title.set_text(pd.title());