From 2f96459f580b3f6b5fd80ab6705e1d215d916592 Mon Sep 17 00:00:00 2001 From: uku Date: Mon, 12 May 2025 12:13:55 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20open=20file=20picker=20=E2=9C=A8asynchro?= =?UTF-8?q?nously=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 51 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2b2cdec..2a57c63 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use color_eyre::eyre::{OptionExt, Result, bail}; use gobject::GtkZiplineFolder; use relm::{Dialog, DialogInput}; use relm4::{ - Component, ComponentController, ComponentParts, Controller, RelmApp, SimpleComponent, + Component, ComponentController, ComponentParts, Controller, RelmApp, adw::{self, prelude::*}, gtk::{self, gio, glib::clone}, }; @@ -39,12 +39,17 @@ impl Config { #[derive(Debug)] enum Message { - SetPath(PathBuf), + OpenFilePicker, SetFolder(ZiplineFolder), StartTheProcess, Nothing, } +#[derive(Debug)] +enum CommandMessage { + SelectedFile(Option), +} + struct Widgets { file_picker_row: adw::ActionRow, send_button: gtk::Button, @@ -66,9 +71,10 @@ impl Tyrolienne { } } -impl SimpleComponent for Tyrolienne { +impl Component for Tyrolienne { type Input = Message; type Output = (); + type CommandOutput = CommandMessage; type Init = (Config, Vec); type Root = adw::ApplicationWindow; type Widgets = Widgets; @@ -103,15 +109,7 @@ impl SimpleComponent for Tyrolienne { file_picker_row.connect_activated(clone!( #[strong] sender, - move |_| { - let file = rfd::FileDialog::new() - .add_filter("Video", &["mp4", "mkv", "webm"]) - .pick_file(); - - if let Some(path) = file { - sender.input(Message::SetPath(path)); - } - } + move |_| sender.input(Message::OpenFilePicker) )); let mut gtk_folders = folders @@ -184,10 +182,14 @@ impl SimpleComponent for Tyrolienne { ComponentParts { model, widgets } } - fn update(&mut self, message: Self::Input, _sender: relm4::ComponentSender) { + fn update( + &mut self, + message: Self::Input, + sender: relm4::ComponentSender, + _root: &Self::Root, + ) { match message { Message::Nothing => {} - Message::SetPath(path) => self.video_path = Some(path), Message::SetFolder(folder) => { self.folder = (folder.id != GtkZiplineFolder::NONE_ID).then_some(folder) } @@ -198,6 +200,27 @@ impl SimpleComponent for Tyrolienne { body: e.to_string(), }), }, + Message::OpenFilePicker => sender.oneshot_command(async { + CommandMessage::SelectedFile( + rfd::AsyncFileDialog::new() + .add_filter("Video file", &["mp4", "mkv", "webm"]) + .pick_file() + .await + .map(|h| h.path().to_owned()), + ) + }), + } + } + + fn update_cmd( + &mut self, + message: Self::CommandOutput, + _sender: relm4::ComponentSender, + _root: &Self::Root, + ) { + match message { + CommandMessage::SelectedFile(Some(path)) => self.video_path = Some(path), + CommandMessage::SelectedFile(None) => {} } }