From c8537e94740e129904fb05883be06188992d17c7 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 3 Jan 2018 05:58:50 +0200 Subject: [PATCH] GtkApplication: Start to refactor to into a App-channel structure. --- hammond-gtk/src/app.rs | 39 +++++++++++++++++++++++++++++++----- hammond-gtk/src/headerbar.rs | 24 ++++++++++------------ 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 29d634d..1934244 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -5,19 +5,28 @@ use gtk::prelude::*; use gio::{ActionMapExt, ApplicationExt, ApplicationExtManual, SimpleActionExt}; use hammond_data::utils::checkup; +use hammond_data::Source; use headerbar::Header; use content::Content; use utils; use std::rc::Rc; +use std::sync::mpsc::{channel, Receiver}; +use std::time::Duration; -#[derive(Debug, Clone)] +#[derive(Clone, Debug)] +pub enum Action { + UpdateSources(Option), +} + +#[derive(Debug)] pub struct App { app_instance: gtk::Application, window: gtk::Window, header: Rc
, content: Rc, + receiver: Receiver, } impl App { @@ -34,11 +43,14 @@ impl App { let window = gtk::Window::new(gtk::WindowType::Toplevel); window.set_default_size(860, 640); window.set_title("Hammond"); - window.connect_delete_event(|w, _| { - w.destroy(); + let app_clone = application.clone(); + window.connect_delete_event(move |_, _| { + app_clone.quit(); Inhibit(false) }); + let (sender, receiver) = channel(); + // TODO: Refactor the initialization order. // Create the headerbar @@ -48,7 +60,7 @@ impl App { let content = Content::new(header.clone()); // Initialize the headerbar - header.init(content.clone()); + header.init(content.clone(), sender.clone()); // Add the Headerbar to the window. window.set_titlebar(&header.container); @@ -60,6 +72,7 @@ impl App { window, header, content, + receiver, } } @@ -132,7 +145,7 @@ impl App { }); } - pub fn run(&self) { + pub fn run(self) { let window = self.window.clone(); let app = self.app_instance.clone(); self.app_instance.connect_startup(move |_| { @@ -141,6 +154,22 @@ impl App { self.setup_timed_callbacks(); self.setup_actions(); + let receiver = self.receiver; + let content = self.content.clone(); + let headerbar = self.header.clone(); + gtk::idle_add(clone!(content, headerbar => move || { + match receiver.recv_timeout(Duration::from_millis(5)) { + Ok(Action::UpdateSources(source)) => { + if let Some(s) = source { + utils::refresh_feed(content.clone(), headerbar.clone(), Some(vec!(s))) + } + } + _ => (), + } + + Continue(true) + })); + ApplicationExtManual::run(&self.app_instance, &[]); } } diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 3b5f17e..9b0fad9 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -4,8 +4,9 @@ use gtk::prelude::*; use hammond_data::Source; use std::rc::Rc; +use std::sync::mpsc::Sender; +use app::Action; -use utils; use content::Content; #[derive(Debug, Clone)] @@ -48,13 +49,13 @@ impl Default for Header { impl Header { #[allow(dead_code)] - pub fn new(content: Rc) -> Rc
{ + pub fn new(content: Rc, sender: Sender) -> Rc
{ let h = Header::default(); - h.init(content); + h.init(content, sender); Rc::new(h) } - pub fn init(&self, content: Rc) { + pub fn init(&self, content: Rc, sender: Sender) { let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/headerbar.ui"); let add_popover: gtk::Popover = builder.get_object("add_popover").unwrap(); @@ -66,9 +67,8 @@ impl Header { println!("{:?}", url.get_text()); }); - let header = Rc::new(self.clone()); - add_button.connect_clicked(clone!(content, header, add_popover, new_url => move |_| { - on_add_bttn_clicked(content.clone(), header.clone(), &new_url); + add_button.connect_clicked(clone!(add_popover, new_url, sender => move |_| { + on_add_bttn_clicked(&new_url, sender.clone()); add_popover.hide(); })); @@ -122,16 +122,14 @@ impl Header { } } -fn on_add_bttn_clicked(content: Rc, headerbar: Rc
, entry: >k::Entry) { +fn on_add_bttn_clicked(entry: >k::Entry, sender: Sender) { let url = entry.get_text().unwrap_or_default(); let source = Source::from_url(&url); - if let Ok(s) = source { - info!("{:?} feed added", url); - // update the db - utils::refresh_feed(content, headerbar, Some(vec![s])); + if source.is_ok() { + sender.send(Action::UpdateSources(source.ok())).unwrap(); } else { - error!("Feed probably already exists."); + error!("Something went wrong."); error!("Error: {:?}", source.unwrap_err()); } }