monorepo/kifu/gtk/src/main.rs

208 lines
6.2 KiB
Rust
Raw Normal View History

2023-08-21 02:12:00 +00:00
use adw::prelude::*;
2024-03-21 21:01:40 +00:00
use async_std::channel::Receiver;
use async_std::task::spawn;
use gio::ActionEntry;
2024-03-21 21:01:40 +00:00
use kifu_core::{Config, ConfigOption, Core, CoreNotification, LibraryPath, Observable};
2023-05-26 04:16:40 +00:00
use kifu_gtk::{
perftrace,
// ui::{ConfigurationPage, Home, PlayingField},
AppWindow,
2023-05-26 04:16:40 +00:00
CoreApi,
};
use std::sync::{Arc, RwLock};
2024-02-27 00:06:41 +00:00
const APP_ID_DEV: &str = "com.luminescent-dreams.kifu-gtk.dev";
const APP_ID_PROD: &str = "com.luminescent-dreams.kifu-gtk";
const RESOURCE_BASE_PATH: &str = "/com/luminescent-dreams/kifu-gtk/";
2024-03-21 21:01:40 +00:00
async fn handler(notifications: Receiver<CoreNotification>, app_id: String) {
loop {
let msg = notifications.recv().await;
match msg {
Ok(CoreNotification::ConfigurationUpdated(cfg)) => {
println!("commiting configuration");
let settings = gio::Settings::new(&app_id);
if let Some(LibraryPath(library_path)) = cfg.get() {
let _ = settings.set_string(
"library-path",
&library_path.into_os_string().into_string().unwrap(),
);
}
}
Ok(_) => println!("discarding message"),
Err(err) => {
println!("shutting down handler with error: {:?}", err);
return;
}
}
}
}
/*
fn handle_response(api: CoreApi, app_window: &AppWindow, message: CoreResponse) {
2023-05-26 04:16:40 +00:00
let playing_field = Arc::new(RwLock::new(None));
match message {
2023-08-25 00:24:41 +00:00
CoreResponse::ConfigurationView(view) => perftrace("ConfigurationView", || {
let config_page = ConfigurationPage::new(api, view);
2023-08-25 00:24:41 +00:00
let window = adw::PreferencesWindow::new();
window.add(&config_page);
window.set_visible_page(&config_page);
window.present();
}),
2023-07-24 23:43:22 +00:00
CoreResponse::HomeView(view) => perftrace("HomeView", || {
2023-05-26 04:16:40 +00:00
let api = api.clone();
let home = Home::new(api, view);
app_window.set_content(&home);
}),
CoreResponse::PlayingFieldView(view) => perftrace("PlayingFieldView", || {
2023-05-26 04:16:40 +00:00
let api = api.clone();
let mut playing_field = playing_field.write().unwrap();
if playing_field.is_none() {
perftrace("creating a new playing field", || {
let field = PlayingField::new(api, view);
app_window.set_content(&field);
*playing_field = Some(field);
})
2023-10-05 16:19:57 +00:00
} else if let Some(field) = playing_field.as_ref() {
field.update_view(view)
2023-05-26 04:16:40 +00:00
}
}),
CoreResponse::UpdatedConfigurationView(view) => perftrace("UpdatedConfiguration", || {
println!("updated configuration: {:?}", view);
}),
2023-05-26 04:16:40 +00:00
}
}
*/
fn load_config(app_id: &str) -> Config {
let settings = gio::Settings::new(app_id);
2024-03-15 18:07:55 +00:00
let lib_path: String = settings.string("library-path").into();
let mut config = Config::new();
2024-03-15 18:07:55 +00:00
config.set(ConfigOption::LibraryPath(lib_path.into()));
config
}
2024-03-15 18:07:55 +00:00
fn setup_app_configuration_action(app: &adw::Application, app_window: AppWindow) {
println!("setup_app_configuration_action");
2024-03-15 18:07:55 +00:00
let action = ActionEntry::builder("show_settings")
.activate(move |_app: &adw::Application, _, _| {
app_window.open_settings();
})
.build();
app.add_action_entries([action]);
println!("setup_app_configuration_action complete");
}
2023-05-26 04:16:40 +00:00
fn main() {
2023-03-31 02:25:11 +00:00
gio::resources_register_include!("com.luminescent-dreams.kifu-gtk.gresource")
.expect("Failed to register resources");
2024-02-27 00:06:41 +00:00
let app_id = if std::env::var_os("ENV") == Some("dev".into()) {
APP_ID_DEV
} else {
APP_ID_PROD
};
let config = load_config(&app_id);
2024-02-27 00:06:41 +00:00
let runtime = Arc::new(
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap(),
);
2024-02-27 00:06:41 +00:00
/*
let config_path = std::env::var("CONFIG")
2023-10-05 16:19:57 +00:00
.map(std::path::PathBuf::from)
.or({
2023-10-05 16:19:57 +00:00
std::env::var("HOME").map(|base| {
let mut config_path = std::path::PathBuf::from(base);
config_path.push(".config");
config_path.push("kifu");
2023-10-05 16:19:57 +00:00
config_path
})
})
.expect("no config path could be found");
2024-02-27 00:06:41 +00:00
*/
let core = Core::new(config);
2024-03-21 21:01:40 +00:00
spawn({
let notifier = core.subscribe();
let app_id = app_id.to_owned();
handler(notifier, app_id)
});
/*
let core_handle = runtime.spawn({
let core = core.clone();
async move {
core.run().await;
}
});
*/
2023-08-21 01:37:40 +00:00
let app = adw::Application::builder()
.application_id("com.luminescent-dreams.kifu-gtk")
2023-08-21 01:37:40 +00:00
.resource_base_path("/com/luminescent-dreams/kifu-gtk")
.build();
app.connect_activate({
let runtime = runtime.clone();
move |app| {
2024-03-15 18:07:55 +00:00
let mut app_window = AppWindow::new(app, core.clone());
2024-03-15 18:07:55 +00:00
match *core.library() {
2024-03-21 21:01:40 +00:00
Some(_) => {}
2024-03-15 18:07:55 +00:00
None => app_window.open_settings(),
}
setup_app_configuration_action(app, app_window.clone());
2024-03-15 18:07:55 +00:00
/*
let api = CoreApi {
rt: runtime.clone(),
core: core.clone(),
};
2024-03-15 18:07:55 +00:00
*/
/*
2023-08-25 00:24:41 +00:00
let action_config = gio::SimpleAction::new("show-config", None);
action_config.connect_activate({
let api = api.clone();
move |_, _| {
api.dispatch(CoreRequest::OpenConfiguration);
}
});
app.add_action(&action_config);
*/
2023-08-25 00:24:41 +00:00
app_window.window.present();
/*
2023-04-07 01:52:39 +00:00
gtk_rx.attach(None, {
let api = api.clone();
move |message| {
2023-05-26 04:16:40 +00:00
perftrace("handle_response", || {
handle_response(api.clone(), &app_window, message)
2023-05-26 04:16:40 +00:00
});
glib::ControlFlow::Continue
2023-03-25 13:24:36 +00:00
}
});
*/
// api.dispatch(CoreRequest::Home);
}
});
println!("running the gtk loop");
app.run();
/* let _ = runtime.block_on(core_handle); */
}