2023-03-20 12:16:20 +00:00
|
|
|
use gtk::prelude::*;
|
2023-05-13 18:02:24 +00:00
|
|
|
use kifu_core::{CoreApp, CoreRequest, CoreResponse};
|
2023-05-26 04:16:40 +00:00
|
|
|
use kifu_gtk::{
|
2023-06-15 03:47:12 +00:00
|
|
|
perftrace,
|
2023-05-26 04:16:40 +00:00
|
|
|
ui::{NewGame, PlayingField},
|
|
|
|
CoreApi,
|
|
|
|
};
|
2023-04-07 02:29:15 +00:00
|
|
|
use std::sync::{Arc, RwLock};
|
2023-03-20 12:16:20 +00:00
|
|
|
|
2023-05-26 04:16:40 +00:00
|
|
|
fn handle_response(api: CoreApi, window: gtk::ApplicationWindow, message: CoreResponse) {
|
|
|
|
let playing_field = Arc::new(RwLock::new(None));
|
|
|
|
match message {
|
2023-06-15 03:47:12 +00:00
|
|
|
CoreResponse::NewGameView(view) => perftrace("NewGameView", || {
|
2023-05-26 04:16:40 +00:00
|
|
|
let api = api.clone();
|
|
|
|
|
|
|
|
let new_game = NewGame::new(api, view);
|
|
|
|
window.set_child(Some(&new_game));
|
2023-06-15 03:47:12 +00:00
|
|
|
}),
|
|
|
|
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() {
|
2023-06-15 03:47:12 +00:00
|
|
|
perftrace("creating a new playing field", || {
|
|
|
|
let field = PlayingField::new(api, view);
|
|
|
|
window.set_child(Some(&field));
|
|
|
|
*playing_field = Some(field);
|
|
|
|
})
|
2023-05-26 04:16:40 +00:00
|
|
|
} else {
|
|
|
|
playing_field.as_ref().map(|field| field.update_view(view));
|
|
|
|
}
|
2023-06-15 03:47:12 +00:00
|
|
|
}),
|
2023-05-26 04:16:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-20 12:16:20 +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");
|
|
|
|
|
2023-03-20 12:16:20 +00:00
|
|
|
let runtime = Arc::new(
|
|
|
|
tokio::runtime::Builder::new_multi_thread()
|
|
|
|
.enable_all()
|
|
|
|
.build()
|
|
|
|
.unwrap(),
|
|
|
|
);
|
|
|
|
|
|
|
|
let core = CoreApp::new();
|
|
|
|
|
|
|
|
let core_handle = runtime.spawn({
|
|
|
|
let core = core.clone();
|
|
|
|
async move {
|
|
|
|
core.run().await;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
let app = gtk::Application::builder()
|
|
|
|
.application_id("com.luminescent-dreams.kifu-gtk")
|
|
|
|
.build();
|
|
|
|
|
|
|
|
app.connect_activate({
|
|
|
|
let runtime = runtime.clone();
|
|
|
|
move |app| {
|
|
|
|
let (gtk_tx, gtk_rx) =
|
2023-05-13 18:02:24 +00:00
|
|
|
gtk::glib::MainContext::channel::<CoreResponse>(gtk::glib::PRIORITY_DEFAULT);
|
2023-03-20 12:16:20 +00:00
|
|
|
|
|
|
|
let api = CoreApi {
|
|
|
|
gtk_tx,
|
|
|
|
rt: runtime.clone(),
|
|
|
|
core: core.clone(),
|
|
|
|
};
|
|
|
|
|
|
|
|
let window = gtk::ApplicationWindow::new(app);
|
|
|
|
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(), window.clone(), message)
|
|
|
|
});
|
2023-04-07 01:52:39 +00:00
|
|
|
Continue(true)
|
2023-03-25 13:24:36 +00:00
|
|
|
}
|
2023-03-20 12:16:20 +00:00
|
|
|
});
|
|
|
|
|
2023-05-26 04:16:40 +00:00
|
|
|
api.dispatch(CoreRequest::NewGame);
|
2023-03-20 12:16:20 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
println!("running the gtk loop");
|
|
|
|
app.run();
|
|
|
|
|
|
|
|
let _ = runtime.block_on(async { core_handle.await });
|
|
|
|
}
|