Add a file picker for encode/decode buttons
This commit is contained in:
4 files changed
+77
-6
No files matched your search
@@ -0,0 +1,5 @@
|
|||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
pub async fn decode(path: PathBuf) {
|
||||||
|
println!("{}", path.display());
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
pub async fn encode(path: PathBuf) {
|
||||||
|
println!("{}", path.display());
|
||||||
|
}
|
||||||
+28
-6
@@ -1,6 +1,14 @@
|
|||||||
|
use gtk4::glib::spawn_future_local;
|
||||||
use gtk4::{Application, ApplicationWindow, Box, Button, Orientation};
|
use gtk4::{Application, ApplicationWindow, Box, Button, Orientation};
|
||||||
use gtk4::{Settings, prelude::*};
|
use gtk4::{Settings, prelude::*};
|
||||||
|
|
||||||
|
mod decode;
|
||||||
|
mod encode;
|
||||||
|
mod util;
|
||||||
|
use decode::decode;
|
||||||
|
use encode::encode;
|
||||||
|
use util::get_user_selected_file;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let app = Application::builder()
|
let app = Application::builder()
|
||||||
.application_id("xyz.lncvrt.videostore")
|
.application_id("xyz.lncvrt.videostore")
|
||||||
@@ -30,13 +38,27 @@ fn main() {
|
|||||||
encodebtn.set_size_request(200, 50);
|
encodebtn.set_size_request(200, 50);
|
||||||
decodebtn.set_size_request(200, 50);
|
decodebtn.set_size_request(200, 50);
|
||||||
|
|
||||||
// encodebtn.connect_clicked(|_| {
|
encodebtn.connect_clicked({
|
||||||
// println!("encode 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(|_| {
|
decodebtn.connect_clicked({
|
||||||
// println!("decode 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(&encodebtn);
|
||||||
vbox.append(&decodebtn);
|
vbox.append(&decodebtn);
|
||||||
|
|||||||
+39
@@ -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();
|
||||||
|
}
|
||||||
Reference in new issue
Block a user