From 8f7df7cdaadf083c6074fd3c143cd3c608cc469e Mon Sep 17 00:00:00 2001 From: Julian Mutter Date: Mon, 9 Oct 2023 20:13:30 +0200 Subject: [PATCH] Start refactoring code --- src/main.rs | 188 +++++++++++++++++++++++++++++----------------------- 1 file changed, 104 insertions(+), 84 deletions(-) diff --git a/src/main.rs b/src/main.rs index 74ff235..1f56491 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +// mod window; + use cairo::Context; use clap::Parser; use gio::ApplicationFlags; @@ -23,7 +25,7 @@ fn main() { println!("Parse args"); let app = Application::builder() .application_id(APP_ID) - .flags(gio::ApplicationFlags::FLAGS_NONE) + // .flags(gio::ApplicationFlags::FLAGS_NONE) .build(); app.connect_activate(move |app| { @@ -33,6 +35,21 @@ fn main() { app.run_with_args(&[] as &[&str]); } +struct Ui { + bottom_bar: gtk4::Box, + header_bar: gtk4::HeaderBar, +} + +fn toggle_fullscreen(ui: &Ui) { + if ui.header_bar.is_visible() { + ui.header_bar.hide(); + ui.bottom_bar.hide(); + } else { + ui.header_bar.show(); + ui.bottom_bar.show(); + } +} + fn build_ui(app: &Application, cli: &Cli) { println!("building ui"); let open_file_button = gtk4::Button::from_icon_name("document-open"); @@ -41,34 +58,38 @@ fn build_ui(app: &Application, cli: &Cli) { .orientation(gtk4::Orientation::Vertical) .build(); - let bottom_bar = gtk4::Box::builder().hexpand_set(true).build(); - let header_bar = gtk4::HeaderBar::builder().build(); + let ui = Ui { + bottom_bar: gtk4::Box::builder().hexpand_set(true).build(), + header_bar: gtk4::HeaderBar::builder().build(), + }; + let ui = Rc::new(RefCell::new(ui)); - header_bar.pack_start(&open_file_button); - app_wrapper.append(&bottom_bar); + ui.borrow().header_bar.pack_start(&open_file_button); + app_wrapper.append(&ui.borrow().bottom_bar); let window = ApplicationWindow::builder() .application(app) .title("Music Reader") .child(&app_wrapper) + .maximized(true) .build(); - window.set_titlebar(Some(&header_bar)); + window.set_titlebar(Some(&ui.borrow().header_bar)); - let toggle_fullscreen = clone!(@weak header_bar, @weak bottom_bar => move || { - if header_bar.is_visible() { - header_bar.hide(); - bottom_bar.hide(); - } else { - header_bar.show(); - bottom_bar.show(); - } - }); + // let toggle_fullscreen = clone!(@weak header_bar, @weak bottom_bar => move || { + // if header_bar.is_visible() { + // header_bar.hide(); + // bottom_bar.hide(); + // } else { + // header_bar.show(); + // bottom_bar.show(); + // } + // }); let load_doc = move |file: &PathBuf| { println!("Loading file..."); let drawing_area = DrawingArea::builder() - .width_request(100) - .height_request(100) + // .width_request(100) + // .height_request(100) .hexpand(true) .vexpand(true) .build(); @@ -81,30 +102,25 @@ fn build_ui(app: &Application, cli: &Cli) { app_wrapper.prepend(&drawing_area); let page_indicator = Label::builder().label("Counting").build(); - let old_indicator = bottom_bar.last_child(); + let old_indicator = ui.borrow().bottom_bar.last_child(); if old_indicator.is_some() { - bottom_bar.remove(&old_indicator.unwrap()); + ui.borrow().bottom_bar.remove(&old_indicator.unwrap()); } - bottom_bar.append(&page_indicator); + ui.borrow().bottom_bar.append(&page_indicator); let doc = PopplerDocument::new_from_file(file, "").unwrap(); let num_pages = doc.get_n_pages(); - let num_pages_ref = Rc::new(RefCell::new(num_pages)); - - let current_page = Rc::new(RefCell::new(1)); - let current_page_copy_another = current_page.clone(); - let current_page_view = current_page.clone(); + let current_page_number = Rc::new(RefCell::new(1)); let surface = cairo::ImageSurface::create(cairo::Format::Rgb24, 0, 0).unwrap(); let ctx = Context::new(&surface).unwrap(); - let update_page_status = clone!(@strong num_pages_ref, @weak page_indicator, @strong drawing_area => move || { - let page_status: String = format!("{} of {}", *current_page_copy_another.borrow_mut(), num_pages); + let update_page_status = glib::clone!(@strong num_pages, @strong current_page_number, @strong page_indicator, @weak drawing_area => @default-panic, move || { + let page_status: String = format!("{} of {}", current_page_number.borrow(), num_pages); let page_status_s: &str = &page_status[..]; page_indicator.set_label(page_status_s); drawing_area.queue_draw(); - }); update_page_status(); @@ -112,14 +128,14 @@ fn build_ui(app: &Application, cli: &Cli) { let click = gtk4::GestureClick::new(); click.set_button(0); click.connect_pressed( - glib::clone!(@weak drawing_area, @strong toggle_fullscreen, @strong num_pages, @strong update_page_status => move |_count, _, x, y| { + glib::clone!(@weak ui, @weak drawing_area, @strong current_page_number, @strong num_pages, @strong update_page_status => @default-panic, move |_count, _, x, y| { let center = drawing_area.width() / 2; if y < (drawing_area.height() / 5) as f64 { - toggle_fullscreen(); - } else if x > center as f64 && *current_page.borrow_mut() < num_pages { - *current_page.borrow_mut() += 1; - } else if x < center as f64 && *current_page.borrow_mut() > 1 { - *current_page.borrow_mut() -= 1; + toggle_fullscreen(&ui.borrow()); + } else if x > center as f64 && *current_page_number.borrow() < num_pages{ + *current_page_number.borrow_mut() += 1; + } else if x < center as f64 && *current_page_number.borrow() > 1 { + *current_page_number.borrow_mut() -= 1; } update_page_status(); @@ -128,43 +144,45 @@ fn build_ui(app: &Application, cli: &Cli) { drawing_area.add_controller(&click); - drawing_area.set_draw_func(move |area, context, _a, _b| { - let current_page_number = ¤t_page_view.borrow_mut(); - context.set_source_rgba(1.0, 1.0, 1.0, 1.0); - context.paint().unwrap(); - context.fill().expect("uh oh"); - context.paint().unwrap(); + drawing_area.set_draw_func( + glib::clone!(@strong current_page_number => @default-panic, move |area, context, _a, _b| { + println!("Draw!"); + context.set_source_rgba(1.0, 1.0, 1.0, 1.0); + context.paint().unwrap(); + context.fill().expect("uh oh"); + context.paint().unwrap(); - let page = doc.get_page(**current_page_number - 1).unwrap(); - let (w, h) = page.get_size(); + let page = doc.get_page(*current_page_number.borrow_mut()- 1).unwrap(); + let (w, h) = page.get_size(); - let width_diff = area.width() as f64 / w; - let height_diff = area.height() as f64 / h; - context.save().unwrap(); - if width_diff > height_diff { - context.translate( - (area.width() as f64 - w * height_diff) / 2.0, - (area.height() as f64 - h * height_diff) / 2.0, - ); - context.scale(height_diff, height_diff); - } else { - context.translate( - (area.width() as f64 - w * width_diff) / 2.0, - (area.height() as f64 - h * width_diff) / 2.0, - ); - context.scale(width_diff, width_diff); - } + let width_diff = area.width() as f64 / w; + let height_diff = area.height() as f64 / h; + context.save().unwrap(); + if width_diff > height_diff { + context.translate( + (area.width() as f64 - w * height_diff) / 2.0, + (area.height() as f64 - h * height_diff) / 2.0, + ); + context.scale(height_diff, height_diff); + } else { + context.translate( + (area.width() as f64 - w * width_diff) / 2.0, + (area.height() as f64 - h * width_diff) / 2.0, + ); + context.scale(width_diff, width_diff); + } - page.render(&context); + page.render(&context); - let r = ctx.paint(); - match r { - Err(v) => println!("Error painting PDF: {v:?}"), - Ok(_v) => {} - } + let r = ctx.paint(); + match r { + Err(v) => println!("Error painting PDF: {v:?}"), + Ok(_v) => {} + } - ctx.show_page().unwrap(); - }); + ctx.show_page().unwrap(); + }), + ); }; match cli.file.as_ref() { @@ -172,23 +190,25 @@ fn build_ui(app: &Application, cli: &Cli) { None => {} } - open_file_button.connect_clicked(clone!(@weak window, @strong load_doc => move |_button| { - let filechooser = gtk4::FileChooserDialog::builder() - .title("Choose a PDF...") - .action(gtk4::FileChooserAction::Open) - .modal(true) - .build(); - filechooser.add_button("_Cancel", gtk4::ResponseType::Cancel); - filechooser.add_button("_Open", gtk4::ResponseType::Accept); - filechooser.set_transient_for(Some(&window)); - filechooser.connect_response(clone!(@strong load_doc => move |d, response| { - if response == gtk4::ResponseType::Accept { - let path = d.file().unwrap().path().unwrap(); - load_doc(&path); - } - d.destroy(); - })); - filechooser.show() - })); + open_file_button.connect_clicked( + glib::clone!(@weak window, @strong load_doc => @default-panic, move |_button| { + let filechooser = gtk4::FileChooserDialog::builder() + .title("Choose a PDF...") + .action(gtk4::FileChooserAction::Open) + .modal(true) + .build(); + filechooser.add_button("_Cancel", gtk4::ResponseType::Cancel); + filechooser.add_button("_Open", gtk4::ResponseType::Accept); + filechooser.set_transient_for(Some(&window)); + filechooser.connect_response(glib::clone!(@strong load_doc => @default-panic, move |d, response| { + if response == gtk4::ResponseType::Accept { + let path = d.file().unwrap().path().unwrap(); + load_doc(&path); + } + d.destroy(); + })); + filechooser.show() + }), + ); window.present(); }