mod patch; mod titlebar; mod boxes; mod menu; mod popover; use gio::SimpleAction; use glib::clone; use titlebar::CustomTitleBar; use boxes::*; use popover::CustomPopoverMenu; use std::path::PathBuf; use std::rc::Rc; use gtk4::{prelude::*, Window}; use gtk4::{ gdk::{ Display }, gio::MenuModel, Application, ApplicationWindow, Builder, StyleContext, }; fn main() { let app = Application::new(Some("com.wyattjmiller.snespatcher"), Default::default()); app.connect_activate(build_ui); app.set_accels_for_action("win.close", &["W"]); app.run(); } fn build_ui(app: &Application) { let resources_bytes = include_bytes!("../resources/resources.gresource"); let resource_data = glib::Bytes::from(&resources_bytes[..]); let res = gio::Resource::from_data(&resource_data).unwrap(); gio::resources_register(&res); let provider = gtk4::CssProvider::new(); provider.load_from_resource("/com/wyattjmiller/snespatcher/style.css"); StyleContext::add_provider_for_display( &Display::default().expect("Error initializing CSS provider!"), &provider, gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION, ); let app_window: Rc = Rc::new(ApplicationWindow::new(app)); let file_picker_window: Window = Window::new(); let popover_menu: CustomPopoverMenu = CustomPopoverMenu::new(); let header_bar: CustomTitleBar = CustomTitleBar::new(); let app_box: AppBox = AppBox::new(); let patch_box: PatchBox = PatchBox::new(&app_window); let rom_box: RomBox = RomBox::new(&app_window); // set popover_menu methods popover_menu.set_texts(); popover_menu.click_about_button(); // TODO: Set popover textviews and put them in a separate file // set header bar methods header_bar.set_actions(); header_bar.set_buttons(); header_bar.set_titlebar(); header_bar.set_window(&app_window); header_bar.click_run_button(); // set patch box methods patch_box.set_label(); patch_box.set_button(); patch_box.set_box(); patch_box.click_button(file_picker_window.clone()); // set rom box methods rom_box.set_label(); rom_box.set_button(); rom_box.set_box(); rom_box.click_button(file_picker_window.clone()); // set app box methods app_box.set_box(&rom_box, &patch_box); // set apps default methods app_window.set_title(Some("SNES Patcher")); app_window.set_resizable(false); app_window.set_child(Some(&app_box.app_box)); // keyboard shortcuts let action_close = SimpleAction::new("close", None); action_close.connect_activate(clone!(@weak app_window => move |_, _| { app_window.close(); })); app_window.add_action(&action_close); // show the app app_window.show(); } async fn dialog>(window: Rc) { let question_dialog = gtk4::MessageDialog::builder() .transient_for(&*window) .modal(true) .buttons(gtk4::ButtonsType::OkCancel) .text("What is your answer?") .build(); let answer = question_dialog.run_future().await; question_dialog.close(); let info_dialog = gtk4::MessageDialog::builder() .transient_for(&*window) .modal(true) .buttons(gtk4::ButtonsType::Close) .text("You answered") .secondary_text(&format!("Your answer: {:?}", answer)) .build(); info_dialog.run_future().await; info_dialog.close(); }