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
+
+
+
+ False
+ True
+ end
+ 2
+
+
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());