Remove old implementation.
This commit is contained in:
parent
b4b2f24c77
commit
326ee75cd8
38
hammond-gtk/src/app.rs
Normal file
38
hammond-gtk/src/app.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
use gtk::prelude::*;
|
||||||
|
use gtk::{Window, WindowType};
|
||||||
|
|
||||||
|
use headerbar::Header;
|
||||||
|
use content::Content;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct App<'a> {
|
||||||
|
window: Window,
|
||||||
|
header: Header,
|
||||||
|
content: Content<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a>App<'a> {
|
||||||
|
pub fn new() -> App<'a> {
|
||||||
|
let window = Window::new(WindowType::Toplevel);
|
||||||
|
let content = Content::new();
|
||||||
|
let header = Header::new(content.stack.clone());
|
||||||
|
|
||||||
|
window.set_default_size(1150, 650);
|
||||||
|
window.connect_delete_event(|w, _| {
|
||||||
|
w.destroy();
|
||||||
|
Inhibit(false)
|
||||||
|
});
|
||||||
|
|
||||||
|
window.set_titlebar(&header.container);
|
||||||
|
window.add(&content.stack);
|
||||||
|
|
||||||
|
window.show_all();
|
||||||
|
window.activate();
|
||||||
|
|
||||||
|
App {
|
||||||
|
window,
|
||||||
|
header,
|
||||||
|
content,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,8 +4,7 @@ use gtk::prelude::*;
|
|||||||
|
|
||||||
// use diesel::Identifiable;
|
// use diesel::Identifiable;
|
||||||
|
|
||||||
// use hammond_data::dbqueries;
|
use hammond_data::Podcast;
|
||||||
// use hammond_data::Podcast;
|
|
||||||
|
|
||||||
use widgets::podcast::PodcastWidget;
|
use widgets::podcast::PodcastWidget;
|
||||||
use views::podcasts::PopulatedView;
|
use views::podcasts::PopulatedView;
|
||||||
@ -16,7 +15,7 @@ pub struct Content {
|
|||||||
pub stack: gtk::Stack,
|
pub stack: gtk::Stack,
|
||||||
pub state: ContentState,
|
pub state: ContentState,
|
||||||
widget: PodcastWidget,
|
widget: PodcastWidget,
|
||||||
podcasts: PopulatedView,
|
pub podcasts: PopulatedView,
|
||||||
empty: EmptyView,
|
empty: EmptyView,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -75,49 +75,6 @@ impl Header {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_headerbar(stack: >k::Stack) -> gtk::HeaderBar {
|
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/headerbar.ui");
|
|
||||||
|
|
||||||
let header: gtk::HeaderBar = builder.get_object("headerbar1").unwrap();
|
|
||||||
let home_button: gtk::Button = builder.get_object("homebutton").unwrap();
|
|
||||||
let refresh_button: gtk::Button = builder.get_object("refbutton").unwrap();
|
|
||||||
|
|
||||||
let add_toggle_button: gtk::MenuButton = builder.get_object("add-toggle-button").unwrap();
|
|
||||||
let add_popover: gtk::Popover = builder.get_object("add-popover").unwrap();
|
|
||||||
let new_url: gtk::Entry = builder.get_object("new-url").unwrap();
|
|
||||||
let add_button: gtk::Button = builder.get_object("add-button").unwrap();
|
|
||||||
// TODO: check if url exists in the db and lock the button
|
|
||||||
new_url.connect_changed(move |url| {
|
|
||||||
println!("{:?}", url.get_text());
|
|
||||||
});
|
|
||||||
|
|
||||||
add_button.connect_clicked(clone!(stack, add_popover, new_url => move |_| {
|
|
||||||
on_add_bttn_clicked(&stack, &new_url);
|
|
||||||
|
|
||||||
// TODO: lock the button instead of hiding and add notification of feed added.
|
|
||||||
// TODO: map the spinner
|
|
||||||
add_popover.hide();
|
|
||||||
}));
|
|
||||||
add_toggle_button.set_popover(&add_popover);
|
|
||||||
|
|
||||||
// TODO: make it a back arrow button, that will hide when appropriate,
|
|
||||||
// and add a StackSwitcher when more views are added.
|
|
||||||
home_button.connect_clicked(clone!(stack => move |_| {
|
|
||||||
let vis = stack.get_visible_child_name().unwrap();
|
|
||||||
stack.set_visible_child_name("fb_parent");
|
|
||||||
if vis != "pdw" {
|
|
||||||
update_podcasts_view(&stack);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// FIXME: There appears to be a memmory leak here.
|
|
||||||
refresh_button.connect_clicked(clone!(stack => move |_| {
|
|
||||||
utils::refresh_feed(&stack, None, None);
|
|
||||||
}));
|
|
||||||
|
|
||||||
header
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_add_bttn_clicked(stack: >k::Stack, entry: >k::Entry) {
|
fn on_add_bttn_clicked(stack: >k::Stack, entry: >k::Entry) {
|
||||||
let url = entry.get_text().unwrap_or_default();
|
let url = entry.get_text().unwrap_or_default();
|
||||||
let url = url_cleaner(&url);
|
let url = url_cleaner(&url);
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
extern crate gdk;
|
extern crate gdk;
|
||||||
extern crate gdk_pixbuf;
|
extern crate gdk_pixbuf;
|
||||||
extern crate gio;
|
extern crate gio;
|
||||||
@ -67,8 +65,8 @@ fn build_ui(app: >k::Application) {
|
|||||||
window.set_default_size(1150, 650);
|
window.set_default_size(1150, 650);
|
||||||
// Setup the Stack that will manage the switch between podcasts_view and podcast_widget.
|
// Setup the Stack that will manage the switch between podcasts_view and podcast_widget.
|
||||||
// let stack = podcasts::setup_stack();
|
// let stack = podcasts::setup_stack();
|
||||||
let content = content::Content::new();
|
let ct = content::Content::new();
|
||||||
let stack = content.stack.clone();
|
let stack = ct.stack.clone();
|
||||||
window.add(&stack);
|
window.add(&stack);
|
||||||
|
|
||||||
window.connect_delete_event(|w, _| {
|
window.connect_delete_event(|w, _| {
|
||||||
@ -103,8 +101,6 @@ fn build_ui(app: >k::Application) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Get the headerbar
|
// Get the headerbar
|
||||||
// let header = headerbar::get_headerbar(&stack);
|
|
||||||
// window.set_titlebar(&header);
|
|
||||||
let header = headerbar::Header::new_initialized(&stack);
|
let header = headerbar::Header::new_initialized(&stack);
|
||||||
window.set_titlebar(&header.container);
|
window.set_titlebar(&header.container);
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ use utils::get_pixbuf_from_path;
|
|||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct PopulatedView {
|
pub struct PopulatedView {
|
||||||
pub container: gtk::Box,
|
pub container: gtk::Box,
|
||||||
flowbox: gtk::FlowBox,
|
pub flowbox: gtk::FlowBox,
|
||||||
viewport: gtk::Viewport,
|
viewport: gtk::Viewport,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,12 +48,6 @@ impl PopulatedView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_empty_view(stack: >k::Stack) {
|
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/empty_view.ui");
|
|
||||||
let view: gtk::Box = builder.get_object("empty_view").unwrap();
|
|
||||||
stack.add_named(&view, "empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
fn show_empty_view(stack: >k::Stack) {
|
fn show_empty_view(stack: >k::Stack) {
|
||||||
stack.set_visible_child_name("empty");
|
stack.set_visible_child_name("empty");
|
||||||
|
|
||||||
@ -118,11 +112,12 @@ fn configure_banner(pd: &Podcast, banner: >k::Image, banner_title: >k::Label
|
|||||||
|
|
||||||
fn on_flowbox_child_activate(stack: >k::Stack, parent: &Podcast) {
|
fn on_flowbox_child_activate(stack: >k::Stack, parent: &Podcast) {
|
||||||
let old = stack.get_child_by_name("pdw").unwrap();
|
let old = stack.get_child_by_name("pdw").unwrap();
|
||||||
let pdw = podcast_widget(stack, parent);
|
let pdw = PodcastWidget::new();
|
||||||
|
pdw.init(stack, parent);
|
||||||
|
|
||||||
stack.remove(&old);
|
stack.remove(&old);
|
||||||
stack.add_named(&pdw, "pdw");
|
stack.add_named(&pdw.container, "pdw");
|
||||||
stack.set_visible_child(&pdw);
|
stack.set_visible_child_name("pdw");
|
||||||
|
|
||||||
// aggresive memory cleanup
|
// aggresive memory cleanup
|
||||||
// probably not needed
|
// probably not needed
|
||||||
@ -146,15 +141,6 @@ fn setup_podcasts_flowbox(stack: >k::Stack) -> gtk::FlowBox {
|
|||||||
flowbox
|
flowbox
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setup_stack() -> gtk::Stack {
|
|
||||||
let stack = gtk::Stack::new();
|
|
||||||
stack.set_transition_type(gtk::StackTransitionType::SlideLeftRight);
|
|
||||||
setup_empty_view(&stack);
|
|
||||||
setup_podcast_widget(&stack);
|
|
||||||
setup_podcasts_flowbox(&stack);
|
|
||||||
stack
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_podcasts_view(stack: >k::Stack) {
|
pub fn update_podcasts_view(stack: >k::Stack) {
|
||||||
let vis = stack.get_visible_child_name().unwrap();
|
let vis = stack.get_visible_child_name().unwrap();
|
||||||
let old = stack.get_child_by_name("fb_parent").unwrap();
|
let old = stack.get_child_by_name("fb_parent").unwrap();
|
||||||
|
|||||||
@ -86,48 +86,6 @@ impl PodcastWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn podcast_widget(stack: >k::Stack, pd: &Podcast) -> gtk::Box {
|
|
||||||
// Adapted from gnome-music AlbumWidget
|
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/podcast_widget.ui");
|
|
||||||
let pd_widget: gtk::Box = builder.get_object("podcast_widget").unwrap();
|
|
||||||
|
|
||||||
let cover: gtk::Image = builder.get_object("cover").unwrap();
|
|
||||||
let title_label: gtk::Label = builder.get_object("title_label").unwrap();
|
|
||||||
let desc_text_view: gtk::TextView = builder.get_object("desc_text_view").unwrap();
|
|
||||||
let view: gtk::Viewport = builder.get_object("view").unwrap();
|
|
||||||
let unsub_button: gtk::Button = builder.get_object("unsub_button").unwrap();
|
|
||||||
let played_button: gtk::Button = builder.get_object("mark_all_played_button").unwrap();
|
|
||||||
|
|
||||||
// TODO: should spawn a thread to avoid locking the UI probably.
|
|
||||||
unsub_button.connect_clicked(clone!(stack, pd => move |bttn| {
|
|
||||||
on_unsub_button_clicked(&stack, &pd, bttn);
|
|
||||||
}));
|
|
||||||
|
|
||||||
title_label.set_text(pd.title());
|
|
||||||
let listbox = episodes_listbox(pd);
|
|
||||||
if let Ok(l) = listbox {
|
|
||||||
view.add(&l);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
let buff = desc_text_view.get_buffer().unwrap();
|
|
||||||
buff.set_text(pd.description());
|
|
||||||
}
|
|
||||||
|
|
||||||
let img = get_pixbuf_from_path(pd);
|
|
||||||
if let Some(i) = img {
|
|
||||||
cover.set_from_pixbuf(&i);
|
|
||||||
}
|
|
||||||
|
|
||||||
played_button.connect_clicked(clone!(stack, pd => move |_| {
|
|
||||||
on_played_button_clicked(&stack, &pd);
|
|
||||||
}));
|
|
||||||
|
|
||||||
show_played_button(pd, &played_button);
|
|
||||||
|
|
||||||
pd_widget
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: Stack manipulation
|
// Note: Stack manipulation
|
||||||
fn on_unsub_button_clicked(stack: >k::Stack, pd: &Podcast, unsub_button: >k::Button) {
|
fn on_unsub_button_clicked(stack: >k::Stack, pd: &Podcast, unsub_button: >k::Button) {
|
||||||
let res = dbqueries::remove_feed(pd);
|
let res = dbqueries::remove_feed(pd);
|
||||||
@ -155,32 +113,15 @@ fn on_played_button_clicked(stack: >k::Stack, pd: &Podcast) {
|
|||||||
update_podcast_widget(stack, pd);
|
update_podcast_widget(stack, pd);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn show_played_button(pd: &Podcast, played_button: >k::Button) {
|
|
||||||
let new_episodes = dbqueries::get_pd_unplayed_episodes(pd);
|
|
||||||
|
|
||||||
if let Ok(n) = new_episodes {
|
|
||||||
if !n.is_empty() {
|
|
||||||
played_button.show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: Stack manipulation
|
|
||||||
pub fn setup_podcast_widget(stack: >k::Stack) {
|
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/podcast_widget.ui");
|
|
||||||
let pd_widget: gtk::Box = builder.get_object("podcast_widget").unwrap();
|
|
||||||
|
|
||||||
stack.add_named(&pd_widget, "pdw");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: Stack manipulation
|
// Note: Stack manipulation
|
||||||
pub fn update_podcast_widget(stack: >k::Stack, pd: &Podcast) {
|
pub fn update_podcast_widget(stack: >k::Stack, pd: &Podcast) {
|
||||||
let old = stack.get_child_by_name("pdw").unwrap();
|
let old = stack.get_child_by_name("pdw").unwrap();
|
||||||
let pdw = podcast_widget(stack, pd);
|
let pdw = PodcastWidget::new();
|
||||||
|
pdw.init(stack, pd);
|
||||||
let vis = stack.get_visible_child_name().unwrap();
|
let vis = stack.get_visible_child_name().unwrap();
|
||||||
|
|
||||||
stack.remove(&old);
|
stack.remove(&old);
|
||||||
stack.add_named(&pdw, "pdw");
|
stack.add_named(&pdw.container, "pdw");
|
||||||
stack.set_visible_child_name(&vis);
|
stack.set_visible_child_name(&vis);
|
||||||
old.destroy();
|
old.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user