Simplify new navigator window

This commit is contained in:
Elias Projahn 2021-02-02 10:25:34 +01:00
parent 23d260687c
commit 59ea1b9d95
3 changed files with 33 additions and 11 deletions

View file

@ -59,10 +59,8 @@ impl Preferences {
if let Some(path) = file.get_path() { if let Some(path) = file.get_path() {
this.music_library_path_row.set_subtitle(Some(path.to_str().unwrap())); this.music_library_path_row.set_subtitle(Some(path.to_str().unwrap()));
let context = glib::MainContext::default(); spawn!(@clone this, async move {
let backend = this.backend.clone(); this.backend.set_music_library_path(path).await.unwrap();
context.spawn_local(async move {
backend.set_music_library_path(path).await.unwrap();
}); });
} }
} }
@ -87,13 +85,10 @@ impl Preferences {
login_button.connect_clicked(clone!(@strong this => move |_| { login_button.connect_clicked(clone!(@strong this => move |_| {
let window = NavigatorWindow::new(this.backend.clone()); let window = NavigatorWindow::new(this.backend.clone());
window.set_transient_for(&this.window); window.set_transient_for(&this.window);
window.show();
let context = glib::MainContext::default(); spawn!(@clone this, async move {
let clone = this.clone(); if let Some(data) = replace!(window.navigator, LoginDialog).await {
context.spawn_local(async move { this.login_row.set_subtitle(Some(&data.username));
if let Some(data) = window.navigator.replace::<_, _, LoginDialog>(()).await {
clone.login_row.set_subtitle(Some(&data.username));
} }
}); });
})); }));

View file

@ -23,6 +23,31 @@ macro_rules! push {
}; };
} }
/// Simplification for replacing the current navigator screen.
///
/// This macro can be invoked in two forms.
///
/// 1. To replace with screens without an input value:
///
/// ```
/// let result = replace!(navigator, ScreenType).await;
/// ```
///
/// 2. To replace with screens with an input value:
///
/// ```
/// let result = replace!(navigator, ScreenType, input).await;
/// ```
#[macro_export]
macro_rules! replace {
($navigator:expr, $screen:ty) => {
$navigator.replace::<_, _, $screen>(())
};
($navigator:expr, $screen:ty, $input:ident) => {
$navigator.replace::<_, _, $screen>($input)
};
}
/// Spawn a future on the GLib MainContext. /// Spawn a future on the GLib MainContext.
/// ///
/// This can be invoked in the following forms: /// This can be invoked in the following forms:

View file

@ -11,7 +11,7 @@ pub struct NavigatorWindow {
} }
impl NavigatorWindow { impl NavigatorWindow {
/// Create a new navigator window. /// Create a new navigator window and show it.
pub fn new(backend: Rc<Backend>) -> Rc<Self> { pub fn new(backend: Rc<Backend>) -> Rc<Self> {
let window = libadwaita::Window::new(); let window = libadwaita::Window::new();
window.set_default_size(600, 424); window.set_default_size(600, 424);
@ -25,6 +25,8 @@ impl NavigatorWindow {
this.window.close(); this.window.close();
})); }));
this.window.show();
this this
} }