Wire Headerbar back button and change initialiazation order.
This commit is contained in:
parent
0bb0035f3c
commit
d74aa9c625
@ -146,6 +146,19 @@
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkHeaderBar" id="headerbar">
|
||||
<property name="can_focus">False</property>
|
||||
@ -166,42 +179,16 @@
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkMenuButton" id="add_toggle_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Add a new feed</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="add-button-image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-add</property>
|
||||
<property name="use_fallback">True</property>
|
||||
<property name="icon_size">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="image-button"/>
|
||||
</style>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child type="center">
|
||||
<object class="GtkStackSwitcher" id="switch">
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="icon_size">0</property>
|
||||
<property name="orientation">vertical</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">4</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
@ -221,20 +208,7 @@
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">3</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
@ -257,8 +231,47 @@
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuButton" id="add_toggle_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Add a new feed</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="add-button-image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-add</property>
|
||||
<property name="use_fallback">True</property>
|
||||
<property name="icon_size">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="image-button"/>
|
||||
</style>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child type="center">
|
||||
<object class="GtkStackSwitcher" id="switch">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="icon_size">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
||||
|
||||
@ -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<ShowStack>,
|
||||
pub shows: Rc<ShowStack>,
|
||||
episodes: Rc<EpisodeStack>,
|
||||
}
|
||||
|
||||
impl Content {
|
||||
pub fn new() -> Rc<Content> {
|
||||
pub fn new(header: Rc<Header>) -> Rc<Content> {
|
||||
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<Header>,
|
||||
}
|
||||
|
||||
impl ShowStack {
|
||||
fn new() -> Rc<ShowStack> {
|
||||
fn new(header: Rc<Header>) -> Rc<ShowStack> {
|
||||
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");
|
||||
|
||||
@ -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<Header> {
|
||||
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<Content>) -> Header {
|
||||
let header = Header::new();
|
||||
header.init(content);
|
||||
header
|
||||
}
|
||||
// pub fn new_initialized(content: Rc<Content>) -> Rc<Header> {
|
||||
// let header = Header::new();
|
||||
// header.init(content);
|
||||
// header
|
||||
// }
|
||||
|
||||
fn init(&self, content: Rc<Content>) {
|
||||
pub fn init(&self, content: Rc<Content>) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 |_| ());
|
||||
|
||||
@ -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<ShowStack>) -> ShowsPopulated {
|
||||
pub fn new_initialized(show: Rc<ShowStack>, header: Rc<Header>) -> ShowsPopulated {
|
||||
let pop = ShowsPopulated::new();
|
||||
pop.init(show);
|
||||
pop.init(show, header);
|
||||
pop
|
||||
}
|
||||
|
||||
pub fn init(&self, show: Rc<ShowStack>) {
|
||||
pub fn init(&self, show: Rc<ShowStack>, header: Rc<Header>) {
|
||||
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.
|
||||
|
||||
@ -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<ShowStack>, pd: &Podcast) -> ShowWidget {
|
||||
pub fn new_initialized(shows: Rc<ShowStack>, header: Rc<Header>, pd: &Podcast) -> ShowWidget {
|
||||
let pdw = ShowWidget::new();
|
||||
pdw.init(shows, pd);
|
||||
pdw.init(shows, header, pd);
|
||||
pdw
|
||||
}
|
||||
|
||||
pub fn init(&self, shows: Rc<ShowStack>, pd: &Podcast) {
|
||||
pub fn init(&self, shows: Rc<ShowStack>, header: Rc<Header>, 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());
|
||||
|
||||
Loading…
Reference in New Issue
Block a user