From 422e3fc6381ad396541e5d80392e194ce3633414 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Thu, 2 Nov 2017 13:25:35 +0200 Subject: [PATCH] Crappy and ugly prototype of an episode banner prototype. --- TODO.md | 4 ++- assets/banner.png | Bin 0 -> 1754 bytes hammond-gtk/gtk/podcasts_child.ui | 47 ++++++++++++++++++------- hammond-gtk/src/views/podcasts_view.rs | 2 +- hammond-gtk/src/widgets/podcast.rs | 41 +++++++++++++-------- 5 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 assets/banner.png diff --git a/TODO.md b/TODO.md index 801a0c1..ea7b8ac 100644 --- a/TODO.md +++ b/TODO.md @@ -10,12 +10,14 @@ **Would be nice:** +- [ ] Use GResource for assets like the banner.png etc, instead of hardcoded paths. - [x] Possibly Convert description labels to textview. - [ ] Make Podcast cover fetchng and loading not block the execution of the program at startup. - [ ] Re-design EpisodeWidget. - [ ] Lazy evaluate episode loading based on the podcast_widget's view scrolling. - [ ] Headerbar back button and stack switching -- [ ] New episode notifier on podcast_flowbox_child, like the one vocal has +- [x] New episode notifier on podcast_flowbox_child, like the one vocal has +- [ ] Polish the flowbox_child banner. **Unhack stuff:** diff --git a/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1af945de32c0bfb5aa80f604f72068b9df64f8 GIT binary patch literal 1754 zcmcIl`&-gy8~=i$DB%>0DDlwc*UE`Cho+|Sjzob%OQs8~)G3KZYnYolO;olr%#!rg zJl9pE%fM4*G(}m0=Ve+l<{>K(8hQC@R6~ zN#pNm{=UYe2q*$@I77bFpciszWKvM#z})b^qAg=^txF57NAD3b?0zMf7n_5|cNh|~ za(aWs`7Pzt%~MtP)z>4g`|kK->q(R^sA00GpVl_Qd_=CM(-uGRl0viG_jh-7Sm(sK z-&pAOdiBP25Z>^#k@z}l(^F%Rmh*S?agg@rimR<{kP(1~^?=e(^_YaO!9rF}roOe& z0HM&HbhmJ~6HUOQ`nt(54B2sA#1_jDOP-BK=;D3}kdQ`Egg9}JvCM8%yCjHmUx82`_V`SRS zB3u0Fh_#X1XYYyGW=u&)Af76Zzj_anfY$yyW+XH?UXG{k>~w*71FhUT+KgiAEA`O> z=5ys(A4TxUg`#6)-aKjdmr4vce4Gy5oA$;{`_O-c>BOzdUz#v@yMIp|Ze2PjWuMvI z?L@@jtYPmtmBwHQ;LksRW74{$5?zPjN%I8O$cFLSVdFIxgrE8B_e4aFpQm5ic3!(H zkcgz;s+&9otHo(^!`!^0H@vGuX6YF#M4vWyJa0l%3to|zfMu%66&K3j@!4qe=nM&- zYMU3i*Te34!T39CsLiQvJoTb1opXIhtT%hog=$OBKBI8XebPyH;y$Xkd*<8*>cZOl z<+hoPc$FZi0_UUn_OG@Hd-+Wh9DW)~$tG2fS59nEz7<_Xi~Sx%n!e}F0u*YK1`g{Udl^h(R`K%sO=qaFKo)wQ^!Ed8pKG3HO=cFZEr4GEM{UJAgo- zvN<)VgL>={TZnICFiMlL5Tl;M>0BuvOreyHvt+Ec%E#-C=BJ{^_67l38R z_Y~E8+gUsLts1)}Z}$&3-1uAD|6V(080(CuIy8Rl{8as+BTZ(Uqyl%}UcUAG$^p@f zc`PY}8%`QaVjIRt(_z9c0!z4x$+$WgzL*@7@AbphYM5i2|LQv+P};~3nCd=bUBgE8 zI)DE%-VwnloADF*O=85jy&Ylx5|4VHNep;?ShA+TO&A^3@B`%+nB(s$_CNF07;&TH zG9>KD`j&(30|GF*7hYLf3v*1(q!*KW=nGLvOwkdUvBb(}RP9sG6y2<#8kKAp-YuP9 z>CS^)3#APx8flhMM0O_ZS~gcv?lLd8$ zv{yKV-*;__w!(gM__s27vg(lJh;8;!QS=9$mq2CWk|I<;R1K92UT7TEi*RD4>sFOO)2lNTm-Py9h;=N+MeF6 zuQEJH(=Pr4k2!ayd9UVOb*#$xwfro!nE!yiO-H!RNT#mfYGi}S?arrnICip@E0Thq zG4kg2O}+|tIt81$c=>;vOLyb=MNF(#1`7;4yxu6_r{O}v`DVW7?8?q_x(p)X^0BVZ z4RMeF$e-!suvC?)4neSmaD5*caY;dbUmK+vC`R{{bS!$3_`XZ&gF^^Z(@_9@1VZEbv@rCld9)5J2+{AXn`Q7yJkG#S_5* literal 0 HcmV?d00001 diff --git a/hammond-gtk/gtk/podcasts_child.ui b/hammond-gtk/gtk/podcasts_child.ui index ad8158a..2497c21 100644 --- a/hammond-gtk/gtk/podcasts_child.ui +++ b/hammond-gtk/gtk/podcasts_child.ui @@ -15,23 +15,44 @@ True False - + + + + True False - False - True - - - True - False - gtk-missing-image - True - 6 - - + center + center + gtk-missing-image + True + 6 + + + + - -1 + 1 + + + + + + 2 diff --git a/hammond-gtk/src/views/podcasts_view.rs b/hammond-gtk/src/views/podcasts_view.rs index b91aaf2..46b807e 100644 --- a/hammond-gtk/src/views/podcasts_view.rs +++ b/hammond-gtk/src/views/podcasts_view.rs @@ -42,7 +42,7 @@ fn populate_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) { if let Ok(pds) = podcasts { pds.iter().for_each(|parent| { - let f = create_flowbox_child(db, &parent); + let f = create_flowbox_child(db, parent); f.connect_activate(clone!(db, stack, parent => move |_| { on_flowbox_child_activate(&db, &stack, &parent); diff --git a/hammond-gtk/src/widgets/podcast.rs b/hammond-gtk/src/widgets/podcast.rs index 14614e6..14c8438 100644 --- a/hammond-gtk/src/widgets/podcast.rs +++ b/hammond-gtk/src/widgets/podcast.rs @@ -30,7 +30,7 @@ macro_rules! clone { ); } -pub fn podcast_widget(db: &Database, stack: >k::Stack, pd: &Podcast) -> gtk::Box { +fn podcast_widget(db: &Database, stack: >k::Stack, pd: &Podcast) -> gtk::Box { // Adapted from gnome-music AlbumWidget let pd_widget_source = include_str!("../../gtk/podcast_widget.ui"); let pd_widget_buidler = gtk::Builder::new_from_string(pd_widget_source); @@ -123,11 +123,7 @@ fn show_played_button(db: &Database, pd: &Podcast, played_button: >k::Button) } } -// TODO: Add something that displays the amount of unplayed episodes on each Podcast. -// Look into the vocal implementation. -// https://github.com/needle-and-thread/\ -// vocal/blob/bced2e23cedb25b5edd0626e5f9361ceace683c9/src/Widgets/CoverArt.vala#L50 -pub fn create_flowbox_child(_db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { +pub fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { let build_src = include_str!("../../gtk/podcasts_child.ui"); let builder = gtk::Builder::new_from_string(build_src); @@ -135,27 +131,44 @@ pub fn create_flowbox_child(_db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { let box_: gtk::Box = builder.get_object("fb_child").unwrap(); let pd_title: gtk::Label = builder.get_object("pd_title").unwrap(); let pd_cover: gtk::Image = builder.get_object("pd_cover").unwrap(); - let events: gtk::EventBox = builder.get_object("events").unwrap(); - - // GDK.TOUCH_MASK - // https://developer.gnome.org/gdk3/stable/gdk3-Events.html#GDK-TOUCH-MASK:CAPS - // http://gtk-rs.org/docs/gdk/constant.TOUCH_MASK.html - events.add_events(4_194_304); + let banner: gtk::Image = builder.get_object("banner").unwrap(); + let banner_title: gtk::Label = builder.get_object("banner_label").unwrap(); pd_title.set_text(pd.title()); let cover = get_pixbuf_from_path(pd.image_uri(), pd.title()); - if let Some(img) = cover { pd_cover.set_from_pixbuf(&img); }; + configure_banner(db, pd, &banner, &banner_title); + let fbc = gtk::FlowBoxChild::new(); fbc.add(&box_); // info!("flowbox child created"); fbc } +fn configure_banner(db: &Database, pd: &Podcast, banner: >k::Image, banner_title: >k::Label) { + let bann = Pixbuf::new_from_file_at_scale("assets/banner.png", 100, 100, true); + if let Ok(b) = bann { + banner.set_from_pixbuf(&b); + + let new_episodes = { + let tempdb = db.lock().unwrap(); + dbqueries::get_pd_unplayed_episodes(&tempdb, pd) + }; + + if let Ok(n) = new_episodes { + if !n.is_empty() { + banner_title.set_text(&n.len().to_string()); + banner.show(); + banner_title.show(); + } + } + } +} + pub fn on_flowbox_child_activate(db: &Database, stack: >k::Stack, parent: &Podcast) { let old = stack.get_child_by_name("pdw").unwrap(); let pdw = podcast_widget(db, stack, parent); @@ -170,7 +183,7 @@ pub fn on_flowbox_child_activate(db: &Database, stack: >k::Stack, parent: &Pod println!("Hello World!, child activated"); } -pub fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option { +fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option { let img_path = downloader::cache_image(pd_title, img_path); if let Some(i) = img_path { Pixbuf::new_from_file_at_scale(&i, 200, 200, true).ok()