From 29837ad39a94f693bdaafa36afe790e29e2f42df Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Thu, 4 Jan 2018 17:05:05 +0200 Subject: [PATCH] Default to using Arc instead of Rc with composite structs of GtkWidgets. --- hammond-gtk/src/app.rs | 6 +++--- hammond-gtk/src/content.rs | 29 ++++++++++++----------------- hammond-gtk/src/headerbar.rs | 10 +++++----- hammond-gtk/src/utils.rs | 5 ++--- hammond-gtk/src/views/episodes.rs | 6 +++--- hammond-gtk/src/views/shows.rs | 6 +++--- hammond-gtk/src/widgets/show.rs | 10 +++++----- 7 files changed, 33 insertions(+), 39 deletions(-) diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 18bb469..d760020 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -11,8 +11,8 @@ use headerbar::Header; use content::Content; use utils; -use std::rc::Rc; use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::Arc; #[derive(Clone, Debug)] pub enum Action { @@ -28,8 +28,8 @@ pub enum Action { pub struct App { app_instance: gtk::Application, window: gtk::Window, - header: Rc
, - content: Rc, + header: Arc
, + content: Arc, receiver: Receiver, sender: Sender, } diff --git a/hammond-gtk/src/content.rs b/hammond-gtk/src/content.rs index 273c6ef..ef0a37e 100644 --- a/hammond-gtk/src/content.rs +++ b/hammond-gtk/src/content.rs @@ -11,19 +11,19 @@ use views::episodes::EpisodesView; use widgets::show::ShowWidget; use app::Action; -use std::rc::Rc; +use std::sync::Arc; use std::sync::mpsc::Sender; #[derive(Debug, Clone)] pub struct Content { stack: gtk::Stack, - shows: Rc, - episodes: Rc, + shows: Arc, + episodes: Arc, sender: Sender, } impl Content { - pub fn new(sender: Sender) -> Rc { + pub fn new(sender: Sender) -> Arc { let stack = gtk::Stack::new(); let episodes = EpisodeStack::new(sender.clone()); let shows = ShowStack::new(sender.clone()); @@ -31,7 +31,7 @@ impl Content { stack.add_titled(&episodes.stack, "episodes", "Episodes"); stack.add_titled(&shows.stack, "shows", "Shows"); - Rc::new(Content { + Arc::new(Content { stack, shows, episodes, @@ -62,7 +62,7 @@ impl Content { self.stack.clone() } - pub fn get_shows(&self) -> Rc { + pub fn get_shows(&self) -> Arc { self.shows.clone() } } @@ -74,10 +74,10 @@ pub struct ShowStack { } impl ShowStack { - fn new(sender: Sender) -> Rc { + fn new(sender: Sender) -> Arc { let stack = gtk::Stack::new(); - let show = Rc::new(ShowStack { + let show = Arc::new(ShowStack { stack, sender: sender.clone(), }); @@ -112,7 +112,7 @@ impl ShowStack { let vis = self.stack.get_visible_child_name().unwrap(); let old = self.stack.get_child_by_name("podcasts").unwrap(); - let pop = ShowsPopulated::new(Rc::new(self.clone()), self.sender.clone()); + let pop = ShowsPopulated::new(Arc::new(self.clone()), self.sender.clone()); self.stack.remove(&old); self.stack.add_named(&pop.container, "podcasts"); @@ -130,7 +130,7 @@ impl ShowStack { pub fn replace_widget(&self, pd: &Podcast) { let old = self.stack.get_child_by_name("widget").unwrap(); - let new = ShowWidget::new(Rc::new(self.clone()), pd, self.sender.clone()); + let new = ShowWidget::new(Arc::new(self.clone()), pd, self.sender.clone()); self.stack.remove(&old); self.stack.add_named(&new.container, "widget"); @@ -175,7 +175,7 @@ pub struct EpisodeStack { } impl EpisodeStack { - fn new(sender: Sender) -> Rc { + fn new(sender: Sender) -> Arc { let episodes = EpisodesView::new(sender.clone()); let empty = EmptyView::new(); let stack = gtk::Stack::new(); @@ -189,12 +189,7 @@ impl EpisodeStack { stack.set_visible_child_name("episodes"); } - Rc::new(EpisodeStack { - // empty, - // populated: pop, - stack, - sender, - }) + Arc::new(EpisodeStack { stack, sender }) } pub fn update(&self) { diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 9b0fad9..7c251fb 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -3,10 +3,10 @@ use gtk::prelude::*; use hammond_data::Source; -use std::rc::Rc; use std::sync::mpsc::Sender; -use app::Action; +use std::sync::Arc; +use app::Action; use content::Content; #[derive(Debug, Clone)] @@ -49,13 +49,13 @@ impl Default for Header { impl Header { #[allow(dead_code)] - pub fn new(content: Rc, sender: Sender) -> Rc
{ + pub fn new(content: Arc, sender: Sender) -> Arc
{ let h = Header::default(); h.init(content, sender); - Rc::new(h) + Arc::new(h) } - pub fn init(&self, content: Rc, sender: Sender) { + pub fn init(&self, content: Arc, 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(); diff --git a/hammond-gtk/src/utils.rs b/hammond-gtk/src/utils.rs index b4ff12f..4928abc 100644 --- a/hammond-gtk/src/utils.rs +++ b/hammond-gtk/src/utils.rs @@ -7,8 +7,7 @@ use hammond_downloader::downloader; use std::thread; use std::sync::mpsc::Sender; -use std::sync::Mutex; -use std::rc::Rc; +use std::sync::{Arc, Mutex}; use std::collections::HashMap; use headerbar::Header; @@ -17,7 +16,7 @@ use app::Action; /// Update the rss feed(s) originating from `source`. /// If `source` is None, Fetches all the `Source` entries in the database and updates them. /// When It's done,it queues up a `RefreshViews` action. -pub fn refresh_feed(headerbar: Rc
, source: Option>, sender: Sender) { +pub fn refresh_feed(headerbar: Arc
, source: Option>, sender: Sender) { headerbar.show_update_notification(); thread::spawn(move || { diff --git a/hammond-gtk/src/views/episodes.rs b/hammond-gtk/src/views/episodes.rs index 85d946b..5fb69f6 100644 --- a/hammond-gtk/src/views/episodes.rs +++ b/hammond-gtk/src/views/episodes.rs @@ -9,8 +9,8 @@ use widgets::episode::EpisodeWidget; use utils::get_pixbuf_from_path; use app::Action; -use std::rc::Rc; use std::sync::mpsc::Sender; +use std::sync::Arc; #[derive(Debug, Clone)] enum ListSplit { @@ -72,7 +72,7 @@ impl Default for EpisodesView { // TODO: REFACTOR ME impl EpisodesView { - pub fn new(sender: Sender) -> Rc { + pub fn new(sender: Sender) -> Arc { let view = EpisodesView::default(); let episodes = dbqueries::get_episodes_widgets_with_limit(100).unwrap(); let now_utc = Utc::now(); @@ -121,7 +121,7 @@ impl EpisodesView { } view.container.show_all(); - Rc::new(view) + Arc::new(view) } pub fn is_empty(&self) -> bool { diff --git a/hammond-gtk/src/views/shows.rs b/hammond-gtk/src/views/shows.rs index 9edf535..01ab9e7 100644 --- a/hammond-gtk/src/views/shows.rs +++ b/hammond-gtk/src/views/shows.rs @@ -9,8 +9,8 @@ use utils::get_pixbuf_from_path; use content::ShowStack; use app::Action; -use std::rc::Rc; use std::sync::mpsc::Sender; +use std::sync::Arc; #[derive(Debug, Clone)] pub struct ShowsPopulated { @@ -35,13 +35,13 @@ impl Default for ShowsPopulated { } impl ShowsPopulated { - pub fn new(show: Rc, sender: Sender) -> ShowsPopulated { + pub fn new(show: Arc, sender: Sender) -> ShowsPopulated { let pop = ShowsPopulated::default(); pop.init(show, sender); pop } - pub fn init(&self, show: Rc, sender: Sender) { + pub fn init(&self, show: Arc, sender: Sender) { use gtk::WidgetExt; // TODO: handle unwraps. diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index b717faf..2c31c03 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -14,8 +14,8 @@ use utils::get_pixbuf_from_path; use content::ShowStack; use app::Action; -use std::rc::Rc; use std::sync::mpsc::Sender; +use std::sync::Arc; use std::fs; #[derive(Debug, Clone)] @@ -54,13 +54,13 @@ impl Default for ShowWidget { } impl ShowWidget { - pub fn new(shows: Rc, pd: &Podcast, sender: Sender) -> ShowWidget { + pub fn new(shows: Arc, pd: &Podcast, sender: Sender) -> ShowWidget { let pdw = ShowWidget::default(); pdw.init(shows, pd, sender); pdw } - pub fn init(&self, shows: Rc, pd: &Podcast, sender: Sender) { + pub fn init(&self, shows: Arc, pd: &Podcast, sender: Sender) { // Hacky workaround so the pd.id() can be retrieved from the `ShowStack`. WidgetExt::set_name(&self.container, &pd.id().to_string()); @@ -107,7 +107,7 @@ impl ShowWidget { } fn on_unsub_button_clicked( - shows: Rc, + shows: Arc, pd: &Podcast, unsub_button: >k::Button, sender: Sender, @@ -132,7 +132,7 @@ fn on_unsub_button_clicked( } #[allow(dead_code)] -fn on_played_button_clicked(shows: Rc, pd: &Podcast) { +fn on_played_button_clicked(shows: Arc, pd: &Podcast) { let _ = dbqueries::update_none_to_played_now(pd); shows.update_widget();