Add a file picker for encode/decode buttons

This commit is contained in:
Lncvrt committed 2026-03-13 20:17:42 -07:00
1 parent cc34dfa855
commit a082c4f6fb
4 files changed
+77 -6

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
use std::path::PathBuf;
pub async fn decode(path: PathBuf) {
println!("{}", path.display());
}
+5
View File
@@ -0,0 +1,5 @@
use std::path::PathBuf;
pub async fn encode(path: PathBuf) {
println!("{}", path.display());
}
+28 -6
View File
@@ -1,6 +1,14 @@
use gtk4::glib::spawn_future_local;
use gtk4::{Application, ApplicationWindow, Box, Button, Orientation};
use gtk4::{Settings, prelude::*};
mod decode;
mod encode;
mod util;
use decode::decode;
use encode::encode;
use util::get_user_selected_file;
fn main() {
let app = Application::builder()
.application_id("xyz.lncvrt.videostore")
@@ -30,13 +38,27 @@ fn main() {
encodebtn.set_size_request(200, 50);
decodebtn.set_size_request(200, 50);
// encodebtn.connect_clicked(|_| {
// println!("encode clicked");
// });
encodebtn.connect_clicked({
let window = window.clone();
move |_| {
get_user_selected_file(&window, |file_path| {
if let Some(path) = file_path {
spawn_future_local(encode(path));
}
});
}
});
// decodebtn.connect_clicked(|_| {
// println!("decode clicked");
// });
decodebtn.connect_clicked({
let window = window.clone();
move |_| {
get_user_selected_file(&window, |file_path| {
if let Some(path) = file_path {
spawn_future_local(decode(path));
}
});
}
});
vbox.append(&encodebtn);
vbox.append(&decodebtn);
+39
View File
@@ -0,0 +1,39 @@
use gtk4::prelude::*;
use gtk4::{ApplicationWindow, FileChooserDialog, ResponseType};
use std::path::PathBuf;
pub fn get_user_selected_file<F>(parent: &ApplicationWindow, callback: F)
where
F: FnOnce(Option<PathBuf>) + 'static,
{
let callback = std::cell::RefCell::new(Some(callback));
let dialog = FileChooserDialog::new(
Some("Choose a File"),
Some(parent),
gtk4::FileChooserAction::Open,
&[
("Cancel", ResponseType::Cancel),
("Open", ResponseType::Accept),
],
);
dialog.connect_response(move |dialog, response| {
let result = if response == ResponseType::Accept {
dialog
.file()
.and_then(|file| file.path())
.filter(|path| path.is_file())
} else {
None
};
if let Some(cb) = callback.borrow_mut().take() {
cb(result);
}
dialog.close();
});
dialog.show();
}