Set up the settings user interface #225
|
@ -1,6 +1,8 @@
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
|
use async_std::channel::Receiver;
|
||||||
|
use async_std::task::spawn;
|
||||||
use gio::ActionEntry;
|
use gio::ActionEntry;
|
||||||
use kifu_core::{Config, ConfigOption, Core};
|
use kifu_core::{Config, ConfigOption, Core, CoreNotification, LibraryPath, Observable};
|
||||||
use kifu_gtk::{
|
use kifu_gtk::{
|
||||||
perftrace,
|
perftrace,
|
||||||
// ui::{ConfigurationPage, Home, PlayingField},
|
// ui::{ConfigurationPage, Home, PlayingField},
|
||||||
|
@ -14,6 +16,29 @@ const APP_ID_PROD: &str = "com.luminescent-dreams.kifu-gtk";
|
||||||
|
|
||||||
const RESOURCE_BASE_PATH: &str = "/com/luminescent-dreams/kifu-gtk/";
|
const RESOURCE_BASE_PATH: &str = "/com/luminescent-dreams/kifu-gtk/";
|
||||||
|
|
||||||
|
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) {
|
fn handle_response(api: CoreApi, app_window: &AppWindow, message: CoreResponse) {
|
||||||
let playing_field = Arc::new(RwLock::new(None));
|
let playing_field = Arc::new(RwLock::new(None));
|
||||||
|
@ -107,6 +132,12 @@ fn main() {
|
||||||
|
|
||||||
let core = Core::new(config);
|
let core = Core::new(config);
|
||||||
|
|
||||||
|
spawn({
|
||||||
|
let notifier = core.subscribe();
|
||||||
|
let app_id = app_id.to_owned();
|
||||||
|
handler(notifier, app_id)
|
||||||
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
let core_handle = runtime.spawn({
|
let core_handle = runtime.spawn({
|
||||||
let core = core.clone();
|
let core = core.clone();
|
||||||
|
@ -121,14 +152,13 @@ fn main() {
|
||||||
.resource_base_path("/com/luminescent-dreams/kifu-gtk")
|
.resource_base_path("/com/luminescent-dreams/kifu-gtk")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
app.connect_activate({
|
app.connect_activate({
|
||||||
let runtime = runtime.clone();
|
let runtime = runtime.clone();
|
||||||
move |app| {
|
move |app| {
|
||||||
let mut app_window = AppWindow::new(app, core.clone());
|
let mut app_window = AppWindow::new(app, core.clone());
|
||||||
|
|
||||||
match *core.library() {
|
match *core.library() {
|
||||||
Some(_) => {},
|
Some(_) => {}
|
||||||
None => app_window.open_settings(),
|
None => app_window.open_settings(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ General Public License for more details.
|
||||||
You should have received a copy of the GNU General Public License along with Kifu. If not, see <https://www.gnu.org/licenses/>.
|
You should have received a copy of the GNU General Public License along with Kifu. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use std::{cell::RefCell, path::Path, rc::Rc};
|
use std::{cell::RefCell, path::Path, rc::Rc, borrow::Cow};
|
||||||
|
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
use glib::Object;
|
use glib::Object;
|
||||||
|
@ -23,6 +23,7 @@ use kifu_core::{Config, ConfigOption, LibraryPath};
|
||||||
|
|
||||||
fn library_chooser_row(
|
fn library_chooser_row(
|
||||||
parent: &impl IsA<gtk::Window>,
|
parent: &impl IsA<gtk::Window>,
|
||||||
|
library_path: Option<LibraryPath>,
|
||||||
on_library_chosen: Rc<impl Fn(ConfigOption) + 'static>,
|
on_library_chosen: Rc<impl Fn(ConfigOption) + 'static>,
|
||||||
) -> adw::ActionRow {
|
) -> adw::ActionRow {
|
||||||
let dialog = gtk::FileDialog::builder().build();
|
let dialog = gtk::FileDialog::builder().build();
|
||||||
|
@ -36,7 +37,7 @@ fn library_chooser_row(
|
||||||
|
|
||||||
let library_row = adw::ActionRow::builder()
|
let library_row = adw::ActionRow::builder()
|
||||||
.title("Library Path")
|
.title("Library Path")
|
||||||
.subtitle("No library set")
|
.subtitle(library_path.map(|LibraryPath(path)| path.to_string_lossy().into_owned()).unwrap_or("No library set".to_owned()))
|
||||||
.css_classes(["preference-item"])
|
.css_classes(["preference-item"])
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@ -104,6 +105,7 @@ impl SettingsView {
|
||||||
|
|
||||||
let library_row = library_chooser_row(
|
let library_row = library_chooser_row(
|
||||||
parent,
|
parent,
|
||||||
|
config.borrow().get(),
|
||||||
Rc::new({
|
Rc::new({
|
||||||
let config = config.clone();
|
let config = config.clone();
|
||||||
move |library_path| {
|
move |library_path| {
|
||||||
|
|
Loading…
Reference in New Issue