GtkApplication: Start to refactor to into a App-channel structure.
This commit is contained in:
parent
a0476fedec
commit
c8537e9474
@ -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<Source>),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct App {
|
||||
app_instance: gtk::Application,
|
||||
window: gtk::Window,
|
||||
header: Rc<Header>,
|
||||
content: Rc<Content>,
|
||||
receiver: Receiver<Action>,
|
||||
}
|
||||
|
||||
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, &[]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<Content>) -> Rc<Header> {
|
||||
pub fn new(content: Rc<Content>, sender: Sender<Action>) -> Rc<Header> {
|
||||
let h = Header::default();
|
||||
h.init(content);
|
||||
h.init(content, sender);
|
||||
Rc::new(h)
|
||||
}
|
||||
|
||||
pub fn init(&self, content: Rc<Content>) {
|
||||
pub fn init(&self, content: Rc<Content>, sender: Sender<Action>) {
|
||||
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<Content>, headerbar: Rc<Header>, entry: >k::Entry) {
|
||||
fn on_add_bttn_clicked(entry: >k::Entry, sender: Sender<Action>) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user