diff --git a/de.frajul.music-reader.gschema.xml b/de.frajul.music-reader.gschema.xml new file mode 100644 index 0000000..a23894b --- /dev/null +++ b/de.frajul.music-reader.gschema.xml @@ -0,0 +1,10 @@ + + + + + + false + Whether the application is in fullscreen mode + + + diff --git a/flake.nix b/flake.nix index 1d66cb2..6c7bbdd 100644 --- a/flake.nix +++ b/flake.nix @@ -42,6 +42,10 @@ mkdir -p $out/share/icons cp ${./music-reader.png} $out/share/icons/music-reader.png + + mkdir -p $out/share/glib-2.0/schemas + cp ${./de.frajul.music-reader.gschema.xml} $out/share/glib-2.0/schemas/de.frajul.music-reader.gschema.xml + glib-compile-schemas $out/share/glib-2.0/schemas/ ''; }; devShell = diff --git a/src/main.rs b/src/main.rs index 8adbc26..eda062b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,9 +5,9 @@ mod ui; use clap::Parser; use env_logger::Env; +use gio::Settings; use gtk::prelude::*; use gtk::Application; -use log::debug; use std::cell::RefCell; use std::path::PathBuf; use std::rc::Rc; @@ -27,7 +27,8 @@ fn main() { let app = Application::builder().application_id(APP_ID).build(); app.connect_activate(move |app| { - let ui = build_ui(app); + let settings = Settings::new(APP_ID); + let ui = build_ui(app, settings); if let Some(file) = cli.file.as_ref() { ui::load_document(file, Rc::clone(&ui), 0); } @@ -36,6 +37,6 @@ fn main() { app.run_with_args(&[] as &[&str]); } -fn build_ui(app: &Application) -> Rc> { - Ui::build(app) +fn build_ui(app: &Application, settings: Settings) -> Rc> { + Ui::build(app, settings) } diff --git a/src/ui.rs b/src/ui.rs index f22e1da..9a3e0d6 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -5,6 +5,7 @@ use std::{ time::{Duration, Instant}, }; +use gio::Settings; use gtk::{ glib, Application, ApplicationWindow, Box, Button, FileChooserAction, FileChooserDialog, HeaderBar, Label, Overlay, Picture, ResponseType, ToggleButton, @@ -19,6 +20,7 @@ use glib::clone; use gtk::prelude::*; pub struct Ui { + settings: Settings, window: ApplicationWindow, bottom_bar: gtk::Box, header_bar: gtk::HeaderBar, @@ -114,22 +116,24 @@ impl DocumentCanvas { } } -pub fn toggle_fullscreen(ui: &Ui) { - match !ui.window.is_fullscreen() { +pub fn set_fullscreen(ui: &Ui, fullscreen: bool) { + match fullscreen { true => { ui.header_bar.hide(); ui.bottom_bar.hide(); ui.window.fullscreen(); let new_area_height = ui.image_container.height() + ui.header_bar.height(); - ui.document_canvas - .as_ref() - .unwrap() - .priority_cache_current_pages(new_area_height); - ui.document_canvas - .as_ref() - .unwrap() - .cache_surrounding_pages(new_area_height); + if ui.document_canvas.is_some() { + ui.document_canvas + .as_ref() + .unwrap() + .priority_cache_current_pages(new_area_height); + ui.document_canvas + .as_ref() + .unwrap() + .cache_surrounding_pages(new_area_height); + } } false => { ui.header_bar.show(); @@ -137,6 +141,11 @@ pub fn toggle_fullscreen(ui: &Ui) { ui.window.unfullscreen(); } } + ui.settings.set_boolean("fullscreen", fullscreen).unwrap(); +} + +pub fn toggle_fullscreen(ui: &Ui) { + set_fullscreen(ui, !ui.window.is_fullscreen()); } fn update_page_status(ui: &Ui) { @@ -213,7 +222,7 @@ fn process_left_click(ui: &mut Ui, x: f64, y: f64) { } impl Ui { - pub fn build(app: &Application) -> Rc> { + pub fn build(app: &Application, settings: Settings) -> Rc> { debug!("building ui"); let open_file_button = Button::from_icon_name("document-open"); let fullscreen_button = Button::from_icon_name("view-fullscreen"); @@ -284,6 +293,7 @@ impl Ui { window.present(); let ui = Ui { + settings, window, app_wrapper, bottom_bar: Box::builder() @@ -351,6 +361,11 @@ impl Ui { ); ui.borrow().window.present(); + + if ui.borrow().settings.boolean("fullscreen") { + set_fullscreen(&ui.borrow(), true); + } + ui } }