fix: open file picker ✨asynchronously✨
This commit is contained in:
parent
42a6e50349
commit
2f96459f58
1 changed files with 37 additions and 14 deletions
51
src/main.rs
51
src/main.rs
|
@ -8,7 +8,7 @@ use color_eyre::eyre::{OptionExt, Result, bail};
|
||||||
use gobject::GtkZiplineFolder;
|
use gobject::GtkZiplineFolder;
|
||||||
use relm::{Dialog, DialogInput};
|
use relm::{Dialog, DialogInput};
|
||||||
use relm4::{
|
use relm4::{
|
||||||
Component, ComponentController, ComponentParts, Controller, RelmApp, SimpleComponent,
|
Component, ComponentController, ComponentParts, Controller, RelmApp,
|
||||||
adw::{self, prelude::*},
|
adw::{self, prelude::*},
|
||||||
gtk::{self, gio, glib::clone},
|
gtk::{self, gio, glib::clone},
|
||||||
};
|
};
|
||||||
|
@ -39,12 +39,17 @@ impl Config {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Message {
|
enum Message {
|
||||||
SetPath(PathBuf),
|
OpenFilePicker,
|
||||||
SetFolder(ZiplineFolder),
|
SetFolder(ZiplineFolder),
|
||||||
StartTheProcess,
|
StartTheProcess,
|
||||||
Nothing,
|
Nothing,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum CommandMessage {
|
||||||
|
SelectedFile(Option<PathBuf>),
|
||||||
|
}
|
||||||
|
|
||||||
struct Widgets {
|
struct Widgets {
|
||||||
file_picker_row: adw::ActionRow,
|
file_picker_row: adw::ActionRow,
|
||||||
send_button: gtk::Button,
|
send_button: gtk::Button,
|
||||||
|
@ -66,9 +71,10 @@ impl Tyrolienne {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SimpleComponent for Tyrolienne {
|
impl Component for Tyrolienne {
|
||||||
type Input = Message;
|
type Input = Message;
|
||||||
type Output = ();
|
type Output = ();
|
||||||
|
type CommandOutput = CommandMessage;
|
||||||
type Init = (Config, Vec<ZiplineFolder>);
|
type Init = (Config, Vec<ZiplineFolder>);
|
||||||
type Root = adw::ApplicationWindow;
|
type Root = adw::ApplicationWindow;
|
||||||
type Widgets = Widgets;
|
type Widgets = Widgets;
|
||||||
|
@ -103,15 +109,7 @@ impl SimpleComponent for Tyrolienne {
|
||||||
file_picker_row.connect_activated(clone!(
|
file_picker_row.connect_activated(clone!(
|
||||||
#[strong]
|
#[strong]
|
||||||
sender,
|
sender,
|
||||||
move |_| {
|
move |_| sender.input(Message::OpenFilePicker)
|
||||||
let file = rfd::FileDialog::new()
|
|
||||||
.add_filter("Video", &["mp4", "mkv", "webm"])
|
|
||||||
.pick_file();
|
|
||||||
|
|
||||||
if let Some(path) = file {
|
|
||||||
sender.input(Message::SetPath(path));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
|
|
||||||
let mut gtk_folders = folders
|
let mut gtk_folders = folders
|
||||||
|
@ -184,10 +182,14 @@ impl SimpleComponent for Tyrolienne {
|
||||||
ComponentParts { model, widgets }
|
ComponentParts { model, widgets }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, message: Self::Input, _sender: relm4::ComponentSender<Self>) {
|
fn update(
|
||||||
|
&mut self,
|
||||||
|
message: Self::Input,
|
||||||
|
sender: relm4::ComponentSender<Self>,
|
||||||
|
_root: &Self::Root,
|
||||||
|
) {
|
||||||
match message {
|
match message {
|
||||||
Message::Nothing => {}
|
Message::Nothing => {}
|
||||||
Message::SetPath(path) => self.video_path = Some(path),
|
|
||||||
Message::SetFolder(folder) => {
|
Message::SetFolder(folder) => {
|
||||||
self.folder = (folder.id != GtkZiplineFolder::NONE_ID).then_some(folder)
|
self.folder = (folder.id != GtkZiplineFolder::NONE_ID).then_some(folder)
|
||||||
}
|
}
|
||||||
|
@ -198,6 +200,27 @@ impl SimpleComponent for Tyrolienne {
|
||||||
body: e.to_string(),
|
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<Self>,
|
||||||
|
_root: &Self::Root,
|
||||||
|
) {
|
||||||
|
match message {
|
||||||
|
CommandMessage::SelectedFile(Some(path)) => self.video_path = Some(path),
|
||||||
|
CommandMessage::SelectedFile(None) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue