diff --git a/hammond-gtk/resources/gtk/headerbar.ui b/hammond-gtk/resources/gtk/headerbar.ui index 291502c..8033dd0 100644 --- a/hammond-gtk/resources/gtk/headerbar.ui +++ b/hammond-gtk/resources/gtk/headerbar.ui @@ -364,6 +364,7 @@ Tobias Bernard True False About + app.about False diff --git a/hammond-gtk/resources/gtk/menus.ui b/hammond-gtk/resources/gtk/menus.ui new file mode 100644 index 0000000..1155b65 --- /dev/null +++ b/hammond-gtk/resources/gtk/menus.ui @@ -0,0 +1,30 @@ + + + + +
+ + _Preferences + app.preferences + +
+
+ + _Keyboard Shortcuts + win.show-help-overlay + + + _Help + app.help + + + _About + app.about + + + _Quit + app.quit + +
+
+
\ No newline at end of file diff --git a/hammond-gtk/resources/resources.xml b/hammond-gtk/resources/resources.xml index b8e1c75..8a61736 100644 --- a/hammond-gtk/resources/resources.xml +++ b/hammond-gtk/resources/resources.xml @@ -1,6 +1,6 @@ - + gtk/episode_widget.ui gtk/show_widget.ui gtk/empty_view.ui @@ -11,6 +11,7 @@ gtk/shows_child.ui gtk/headerbar.ui gtk/inapp_notif.ui + gtk/menus.ui gtk/style.css diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 4668aa3..76dce3a 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -1,6 +1,6 @@ #![allow(new_without_default)] -use gio::{ApplicationExt, ApplicationExtManual, ApplicationFlags, Settings, SettingsExt}; +use gio::{ApplicationExt, ApplicationExtManual, ApplicationFlags, Settings, SettingsExt, SimpleAction, SimpleActionExt, ActionMapExt}; use glib; use gtk; use gtk::prelude::*; @@ -67,6 +67,19 @@ impl App { let window = gtk::Window::new(gtk::WindowType::Toplevel); window.set_title("Hammond"); + // Ideally a lot more than actions would happen in startup & window + // creation would be in activate + application.connect_startup(clone!(window => move |app| { + let about = SimpleAction::new("about", None); + // Should investigate use of active_window here + about.connect_activate(clone!(window => move |_, _| about_dialog(&window))); + app.add_action(&about); + + let quit = SimpleAction::new("quit", None); + quit.connect_activate(clone!(app => move |_, _| app.quit())); + app.add_action(&quit); + })); + window.connect_delete_event(clone!(application, settings, window => move |_, _| { WindowGeometry::from_window(&window).write(&settings); application.quit(); @@ -224,3 +237,40 @@ fn build_ui(window: >k::Window, app: >k::Application) { window.activate(); app.connect_activate(move |_| ()); } + +// Totally copied it from fractal. +// https://gitlab.gnome.org/danigm/fractal/blob/503e311e22b9d7540089d735b92af8e8f93560c5/fractal-gtk/src/app.rs#L1883-1912 +fn about_dialog(window: >k::Window) { + // Feel free to add yourself if you contribured. + let authors = &[ + "Constantin Nickel", + "Gabriele Musco", + "James Wykeham-Martin", + "Jordan Petridis", + "Julian Sparber", + "Rowan Lewis", + "Zander Brown" + ]; + + let dialog = gtk::AboutDialog::new(); + // Waiting for a logo. + // dialog.set_logo_icon_name("org.gnome.Hammond"); + dialog.set_logo_icon_name("multimedia-player"); + dialog.set_comments("Podcast Client for the GNOME Desktop."); + dialog.set_copyright("© 2017, 2018 Jordan Petridis"); + dialog.set_license_type(gtk::License::Gpl30); + dialog.set_modal(true); + // TODO: make it show it fetches the commit hash from which it was built + // and the version number is kept in sync automaticly + dialog.set_version("0.3.3"); + dialog.set_program_name("Hammond"); + // TODO: Need a wiki page first. + // dialog.set_website("https://wiki.gnome.org/Design/Apps/Potential/Podcasts"); + // dialog.set_website_label("Learn more about Hammond"); + dialog.set_transient_for(window); + + dialog.set_artists(&["Tobias Bernard"]); + dialog.set_authors(authors); + + dialog.show(); +} diff --git a/hammond-gtk/src/appnotif.rs b/hammond-gtk/src/appnotif.rs index 22b0c6e..2c87049 100644 --- a/hammond-gtk/src/appnotif.rs +++ b/hammond-gtk/src/appnotif.rs @@ -21,7 +21,7 @@ pub struct InAppNotification { impl Default for InAppNotification { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/inapp_notif.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/inapp_notif.ui"); let revealer: gtk::Revealer = builder.get_object("revealer").unwrap(); let text: gtk::Label = builder.get_object("text").unwrap(); diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 597a96c..4cdaf52 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -23,7 +23,6 @@ pub struct Header { switch: gtk::StackSwitcher, back: gtk::Button, show_title: gtk::Label, - about: gtk::ModelButton, import: gtk::ModelButton, export: gtk::ModelButton, update_button: gtk::ModelButton, @@ -34,7 +33,7 @@ pub struct Header { impl Default for Header { fn default() -> Header { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/headerbar.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/headerbar.ui"); let header = builder.get_object("headerbar").unwrap(); let add_toggle = builder.get_object("add_toggle").unwrap(); @@ -47,7 +46,6 @@ impl Default for Header { let update_box = builder.get_object("update_notification").unwrap(); let update_label = builder.get_object("update_label").unwrap(); let update_spinner = builder.get_object("update_spinner").unwrap(); - let about = builder.get_object("about").unwrap(); Header { container: header, @@ -55,7 +53,6 @@ impl Default for Header { switch, back, show_title, - about, import, export, update_button, @@ -75,7 +72,7 @@ impl Header { } pub fn init(&self, content: &Content, window: >k::Window, sender: &Sender) { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/headerbar.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/headerbar.ui"); let add_popover: gtk::Popover = builder.get_object("add_popover").unwrap(); let new_url: gtk::Entry = builder.get_object("new_url").unwrap(); @@ -107,9 +104,6 @@ impl Header { })); })); - self.about - .connect_clicked(clone!(window => move |_| about_dialog(&window))); - self.import.connect_clicked( clone!(window, sender => move |_| on_import_clicked(&window, &sender)), ); @@ -288,39 +282,3 @@ fn on_import_clicked(window: >k::Window, sender: &Sender) { dialog.run(); } - -// Totally copied it from fractal. -// https://gitlab.gnome.org/danigm/fractal/blob/503e311e22b9d7540089d735b92af8e8f93560c5/fractal-gtk/src/app.rs#L1883-1912 -fn about_dialog(window: >k::Window) { - // Feel free to add yourself if you contribured. - let authors = &[ - "Constantin Nickel", - "Gabriele Musco", - "James Wykeham-Martin", - "Jordan Petridis", - "Julian Sparber", - "Rowan Lewis", - ]; - - let dialog = gtk::AboutDialog::new(); - // Waiting for a logo. - // dialog.set_logo_icon_name("org.gnome.Hammond"); - dialog.set_logo_icon_name("multimedia-player"); - dialog.set_comments("Podcast Client for the GNOME Desktop."); - dialog.set_copyright("© 2017, 2018 Jordan Petridis"); - dialog.set_license_type(gtk::License::Gpl30); - dialog.set_modal(true); - // TODO: make it show it fetches the commit hash from which it was built - // and the version number is kept in sync automaticly - dialog.set_version("0.3.3"); - dialog.set_program_name("Hammond"); - // TODO: Need a wiki page first. - // dialog.set_website("https://wiki.gnome.org/Design/Apps/Potential/Podcasts"); - // dialog.set_website_label("Learn more about Hammond"); - dialog.set_transient_for(window); - - dialog.set_artists(&["Tobias Bernard"]); - dialog.set_authors(authors); - - dialog.show(); -} diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 78d9027..c8d4227 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -86,7 +86,7 @@ fn main() { // Add custom style let provider = gtk::CssProvider::new(); - gtk::CssProvider::load_from_resource(&provider, "/org/gnome/hammond/gtk/style.css"); + gtk::CssProvider::load_from_resource(&provider, "/org/gnome/Hammond/gtk/style.css"); gtk::StyleContext::add_provider_for_screen( &gdk::Screen::get_default().expect("Error initializing gtk css provider."), &provider, diff --git a/hammond-gtk/src/widgets/empty.rs b/hammond-gtk/src/widgets/empty.rs index ad3d152..444de79 100644 --- a/hammond-gtk/src/widgets/empty.rs +++ b/hammond-gtk/src/widgets/empty.rs @@ -7,7 +7,7 @@ pub struct EmptyView { impl Default for EmptyView { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/empty_view.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/empty_view.ui"); let view: gtk::Box = builder.get_object("empty_view").unwrap(); EmptyView { container: view } diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index 01ae0ff..d938e92 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -33,7 +33,7 @@ pub struct EpisodeWidget { impl Default for EpisodeWidget { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episode_widget.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/episode_widget.ui"); let container: gtk::Box = builder.get_object("episode_container").unwrap(); let progress: gtk::ProgressBar = builder.get_object("progress_bar").unwrap(); diff --git a/hammond-gtk/src/widgets/home_view.rs b/hammond-gtk/src/widgets/home_view.rs index c3359cb..1341fea 100644 --- a/hammond-gtk/src/widgets/home_view.rs +++ b/hammond-gtk/src/widgets/home_view.rs @@ -49,7 +49,7 @@ pub struct HomeView { impl Default for HomeView { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episodes_view.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/episodes_view.ui"); let container: gtk::Box = builder.get_object("container").unwrap(); let scrolled_window: gtk::ScrolledWindow = builder.get_object("scrolled_window").unwrap(); let frame_parent: gtk::Box = builder.get_object("frame_parent").unwrap(); @@ -180,7 +180,7 @@ struct HomeEpisode { impl Default for HomeEpisode { fn default() -> Self { let builder = - gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episodes_view_widget.ui"); + gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/episodes_view_widget.ui"); let container: gtk::Box = builder.get_object("container").unwrap(); let image: gtk::Image = builder.get_object("cover").unwrap(); let ep = EpisodeWidget::default(); @@ -197,7 +197,7 @@ impl Default for HomeEpisode { impl HomeEpisode { fn new(episode: EpisodeWidgetQuery, sender: &Sender) -> HomeEpisode { let builder = - gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episodes_view_widget.ui"); + gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/episodes_view_widget.ui"); let container: gtk::Box = builder.get_object("container").unwrap(); let image: gtk::Image = builder.get_object("cover").unwrap(); let pid = episode.podcast_id(); @@ -224,4 +224,4 @@ impl HomeEpisode { fn set_cover(&self, podcast_id: i32) -> Result<(), Error> { utils::set_image_from_path(&self.image, podcast_id, 64) } -} +} \ No newline at end of file diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index 674e693..388ae12 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -41,7 +41,7 @@ pub struct ShowWidget { impl Default for ShowWidget { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/show_widget.ui"); let container: gtk::Box = builder.get_object("container").unwrap(); let scrolled_window: gtk::ScrolledWindow = builder.get_object("scrolled_window").unwrap(); let episodes = builder.get_object("episodes").unwrap(); @@ -79,7 +79,7 @@ impl ShowWidget { } pub fn init(&mut self, pd: &Arc, sender: &Sender) { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/show_widget.ui"); self.unsub .connect_clicked(clone!(pd, sender => move |bttn| { @@ -189,7 +189,7 @@ fn populate_listbox( })); if count == 0 { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/empty_show.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/empty_show.ui"); let container: gtk::Box = builder.get_object("empty_show").unwrap(); show.episodes.add(&container); return Ok(()); diff --git a/hammond-gtk/src/widgets/shows_view.rs b/hammond-gtk/src/widgets/shows_view.rs index d9dc9e7..ad7982e 100644 --- a/hammond-gtk/src/widgets/shows_view.rs +++ b/hammond-gtk/src/widgets/shows_view.rs @@ -28,7 +28,7 @@ pub struct ShowsView { impl Default for ShowsView { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/shows_view.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/shows_view.ui"); let container: gtk::Box = builder.get_object("fb_parent").unwrap(); let scrolled_window: gtk::ScrolledWindow = builder.get_object("scrolled_window").unwrap(); let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); @@ -129,7 +129,7 @@ struct ShowsChild { impl Default for ShowsChild { fn default() -> Self { - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/shows_child.ui"); + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/shows_child.ui"); let container: gtk::Box = builder.get_object("fb_child").unwrap(); let cover: gtk::Image = builder.get_object("pd_cover").unwrap();