From 70a82dc2e83a4f385052086947cacbc0a71841f0 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 8 Jan 2024 21:31:53 +0100 Subject: [PATCH 001/124] Init sandbox example --- Cargo.toml | 5 +++++ examples/sandbox/Cargo.toml | 10 ++++++++++ examples/sandbox/src/main.rs | 23 +++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 examples/sandbox/Cargo.toml create mode 100644 examples/sandbox/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index af3a2409..ada766b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,8 @@ +[workspace] +members = [ + "examples/*" +] + [package] name = "egui-file-explorer" version = "0.1.0" diff --git a/examples/sandbox/Cargo.toml b/examples/sandbox/Cargo.toml new file mode 100644 index 00000000..680857c9 --- /dev/null +++ b/examples/sandbox/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "sandbox" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +egui = "0.25.0" +eframe = { version = "0.25.0", default-features = false, features = ["glow"] } diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs new file mode 100644 index 00000000..2b28e8e9 --- /dev/null +++ b/examples/sandbox/src/main.rs @@ -0,0 +1,23 @@ + +struct MyApp; + +impl eframe::App for MyApp { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading("My egui application"); + }); + } +} + +fn main() -> eframe::Result<()> { + let options = eframe::NativeOptions { + viewport: egui::ViewportBuilder::default() .with_inner_size([1080.0, 720.0]), + ..Default::default() + }; + + eframe::run_native( + "My egui application", + options, + Box::new(|_| Box::new(MyApp{ })) + ) +} From 9b24dc1e130caf13ac39f6177900d446dd20bbdf Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 8 Jan 2024 21:36:14 +0100 Subject: [PATCH 002/124] Add egui dependency --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index ada766b4..5a299fac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +egui = "0.25.0" From 2928e6978a5f340776083d9b9b6f2c52ff9f9cab Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 8 Jan 2024 22:18:53 +0100 Subject: [PATCH 003/124] Setup panels --- examples/sandbox/Cargo.toml | 2 +- examples/sandbox/src/main.rs | 18 ++++++++++++++-- src/file_explorer.rs | 41 ++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 ++- 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 src/file_explorer.rs diff --git a/examples/sandbox/Cargo.toml b/examples/sandbox/Cargo.toml index 680857c9..979ee90b 100644 --- a/examples/sandbox/Cargo.toml +++ b/examples/sandbox/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -egui = "0.25.0" eframe = { version = "0.25.0", default-features = false, features = ["glow"] } +egui-file-explorer = { version = "0.1.0", path = "../../"} diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index 2b28e8e9..b3248a51 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -1,10 +1,24 @@ +use eframe::egui; +use egui_file_explorer::FileExplorer; -struct MyApp; +struct MyApp { + file_explorer: FileExplorer +} + +impl MyApp { + pub fn new() -> Self { + Self { + file_explorer: FileExplorer::new() + } + } +} impl eframe::App for MyApp { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { ui.heading("My egui application"); + + self.file_explorer.update(ctx); }); } } @@ -18,6 +32,6 @@ fn main() -> eframe::Result<()> { eframe::run_native( "My egui application", options, - Box::new(|_| Box::new(MyApp{ })) + Box::new(|_| Box::new(MyApp::new())) ) } diff --git a/src/file_explorer.rs b/src/file_explorer.rs new file mode 100644 index 00000000..b2901fab --- /dev/null +++ b/src/file_explorer.rs @@ -0,0 +1,41 @@ + +pub struct FileExplorer; + +impl FileExplorer { + pub fn new() -> Self { + FileExplorer { } + } + + pub fn update(&mut self, ctx: &egui::Context) { + // TODO: Make window title and options configurable + egui::Window::new("File explorer") + .default_size([800.0, 500.0]) + .show(&ctx, |ui| { + egui::TopBottomPanel::top("fe_top_panel") + .resizable(false) + .min_height(32.0) + .show_inside(ui, |ui| { + ui.label("This is the top panel!") + }); + + egui::SidePanel::left("fe_left_panel") + .resizable(true) + .default_width(150.0) + .width_range(80.0..=300.0) + .show_inside(ui, |ui| { + ui.label("This is the left panel!") + }); + + egui::TopBottomPanel::bottom("fe_bottom_panel") + .resizable(false) + .min_height(60.0) + .show_inside(ui, |ui| { + ui.label("This is the bottom panel!") + }); + + egui::CentralPanel::default().show_inside(ui, |ui| { + ui.label("This is the central panel!") + }); + }); + } +} diff --git a/src/lib.rs b/src/lib.rs index 0c45deb2..5e8a391f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ -// Implement your code here +mod file_explorer; +pub use file_explorer::FileExplorer; From 3335d50409a55c933bae7258013632c4b1ba6c3c Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 8 Jan 2024 23:04:56 +0100 Subject: [PATCH 004/124] Add top panel ui (WIP) --- src/file_explorer.rs | 67 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index b2901fab..2109f4c5 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -11,11 +11,12 @@ impl FileExplorer { egui::Window::new("File explorer") .default_size([800.0, 500.0]) .show(&ctx, |ui| { + ui.style_mut().spacing.window_margin = egui::Margin::symmetric(0.0, 0.0); + egui::TopBottomPanel::top("fe_top_panel") .resizable(false) - .min_height(32.0) .show_inside(ui, |ui| { - ui.label("This is the top panel!") + self.update_top_panel(ctx, ui); }); egui::SidePanel::left("fe_left_panel") @@ -23,19 +24,73 @@ impl FileExplorer { .default_width(150.0) .width_range(80.0..=300.0) .show_inside(ui, |ui| { - ui.label("This is the left panel!") + self.update_left_panel(ui); }); egui::TopBottomPanel::bottom("fe_bottom_panel") .resizable(false) - .min_height(60.0) .show_inside(ui, |ui| { - ui.label("This is the bottom panel!") + self.update_bottom_panel(ui); }); egui::CentralPanel::default().show_inside(ui, |ui| { - ui.label("This is the central panel!") + self.update_central_panel(ui); }); }); } + + fn update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); + + ui.horizontal(|ui| { + // Navigation buttons + let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<-")); + let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<")); + let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new(">")); + let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("+")); + + // Current path display + egui::Frame::default() + .stroke(egui::Stroke::new(1.0, egui::Color32::GRAY)) + .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .rounding(egui::Rounding::from(5.0)) + .show(ui, |ui| { + egui::ScrollArea::horizontal() + .show(ui, |ui| { + ui.horizontal(|ui| { + // NOTE: These are currently only hardcoded test values! + let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), + egui::Button::new("home")); + ui.label(">"); + + let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), + egui::Button::new("user")); + ui.label(">"); + + let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), + egui::Button::new("documents")); + ui.label(">"); + + let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), + egui::Button::new("projects")); + }); + }); + }) + }); + + ui.add_space(ctx.style().spacing.item_spacing.y); + } + + fn update_left_panel(&mut self, ui: &mut egui::Ui) { + ui.label("This is the left panel!"); + } + + fn update_bottom_panel(&mut self, ui: &mut egui::Ui) { + ui.label("This is the bottom panel!"); + } + + fn update_central_panel(&mut self, ui: &mut egui::Ui) { + ui.label("This is the central panel!"); + } + } From 45f29e08be8063c28de6ea03273aa14610e87b2c Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 13 Jan 2024 22:30:34 +0100 Subject: [PATCH 005/124] Add left panel ui --- examples/sandbox/Cargo.toml | 3 +++ examples/sandbox/src/main.rs | 6 ++++-- src/file_explorer.rs | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/examples/sandbox/Cargo.toml b/examples/sandbox/Cargo.toml index 979ee90b..8a4d40ff 100644 --- a/examples/sandbox/Cargo.toml +++ b/examples/sandbox/Cargo.toml @@ -8,3 +8,6 @@ edition = "2021" [dependencies] eframe = { version = "0.25.0", default-features = false, features = ["glow"] } egui-file-explorer = { version = "0.1.0", path = "../../"} + +# Enable image loading +egui_extras = { version = "0.25.0", default-features = false, features = ["all_loaders"]} diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index b3248a51..fbbb13b4 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -6,7 +6,9 @@ struct MyApp { } impl MyApp { - pub fn new() -> Self { + pub fn new(cc: &eframe::CreationContext) -> Self { + egui_extras::install_image_loaders(&cc.egui_ctx); + Self { file_explorer: FileExplorer::new() } @@ -32,6 +34,6 @@ fn main() -> eframe::Result<()> { eframe::run_native( "My egui application", options, - Box::new(|_| Box::new(MyApp::new())) + Box::new(|ctx| Box::new(MyApp::new(ctx))) ) } diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 2109f4c5..f05d65e0 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -24,7 +24,7 @@ impl FileExplorer { .default_width(150.0) .width_range(80.0..=300.0) .show_inside(ui, |ui| { - self.update_left_panel(ui); + self.update_left_panel(ctx, ui); }); egui::TopBottomPanel::bottom("fe_bottom_panel") @@ -76,13 +76,40 @@ impl FileExplorer { }); }); }) + + // TODO: Search bar }); ui.add_space(ctx.style().spacing.item_spacing.y); } - fn update_left_panel(&mut self, ui: &mut egui::Ui) { - ui.label("This is the left panel!"); + fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + ui.label("Drives:"); + + // NOTE: These are currently only hardcoded test values! + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::Button::new("(C:)")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::Button::new("Toshiba(D:)")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), + egui::Button::new("Samsung 980..(E:)")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::Button::new("(F:)")); + + ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); + + ui.label("User:"); + + let folder_icon = egui::include_image!("../data/folder_icon.png"); + + // NOTE: These are currently only hardcoded test values! + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), + egui::Button::image_and_text(folder_icon.clone(), "Desktop")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), + egui::Button::image_and_text(folder_icon.clone(), "Documents")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), + egui::Button::image_and_text(folder_icon.clone(), "Downloads")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), + egui::Button::image_and_text(folder_icon.clone(), "Music")); + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), + egui::Button::image_and_text(folder_icon.clone(), "Pictures")); } fn update_bottom_panel(&mut self, ui: &mut egui::Ui) { From c7f845dccb440b3d55d955db35e7ec5a82f470fc Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 13 Jan 2024 23:14:38 +0100 Subject: [PATCH 006/124] Replace images with icons --- examples/sandbox/Cargo.toml | 3 --- examples/sandbox/src/main.rs | 4 +--- src/file_explorer.rs | 13 ++++++------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/examples/sandbox/Cargo.toml b/examples/sandbox/Cargo.toml index 8a4d40ff..979ee90b 100644 --- a/examples/sandbox/Cargo.toml +++ b/examples/sandbox/Cargo.toml @@ -8,6 +8,3 @@ edition = "2021" [dependencies] eframe = { version = "0.25.0", default-features = false, features = ["glow"] } egui-file-explorer = { version = "0.1.0", path = "../../"} - -# Enable image loading -egui_extras = { version = "0.25.0", default-features = false, features = ["all_loaders"]} diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index fbbb13b4..f556546b 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -6,9 +6,7 @@ struct MyApp { } impl MyApp { - pub fn new(cc: &eframe::CreationContext) -> Self { - egui_extras::install_image_loaders(&cc.egui_ctx); - + pub fn new(_cc: &eframe::CreationContext) -> Self { Self { file_explorer: FileExplorer::new() } diff --git a/src/file_explorer.rs b/src/file_explorer.rs index f05d65e0..6abd7c37 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -97,19 +97,18 @@ impl FileExplorer { ui.label("User:"); - let folder_icon = egui::include_image!("../data/folder_icon.png"); - // NOTE: These are currently only hardcoded test values! + // TODO: Align button text to the left! ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::image_and_text(folder_icon.clone(), "Desktop")); + egui::Button::new("🗀 Desktop")); ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::image_and_text(folder_icon.clone(), "Documents")); + egui::Button::new("🗀 Documents")); ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::image_and_text(folder_icon.clone(), "Downloads")); + egui::Button::new("🗀 Downloads")); ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::image_and_text(folder_icon.clone(), "Music")); + egui::Button::new("🗀 Music")); ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::image_and_text(folder_icon.clone(), "Pictures")); + egui::Button::new("🗀 Pictures")); } fn update_bottom_panel(&mut self, ui: &mut egui::Ui) { From 84c3efe87f67cbcbe55b0999393ea0d5b3bd7ad7 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 13 Jan 2024 23:21:38 +0100 Subject: [PATCH 007/124] Add global dark light mode buttons --- examples/sandbox/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index f556546b..c6c64385 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -17,6 +17,7 @@ impl eframe::App for MyApp { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { ui.heading("My egui application"); + egui::widgets::global_dark_light_mode_buttons(ui); self.file_explorer.update(ctx); }); From 53ce6916ef239e02863ddbef5a7e581a096d3bf0 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 13 Jan 2024 23:27:54 +0100 Subject: [PATCH 008/124] Add search bar --- src/file_explorer.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 6abd7c37..c60ebce8 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,9 +1,11 @@ -pub struct FileExplorer; +pub struct FileExplorer { + search_value: String +} impl FileExplorer { pub fn new() -> Self { - FileExplorer { } + FileExplorer { search_value: String::new() } } pub fn update(&mut self, ctx: &egui::Context) { @@ -55,6 +57,7 @@ impl FileExplorer { .inner_margin(egui::Margin::symmetric(4.0, 4.0)) .rounding(egui::Rounding::from(5.0)) .show(ui, |ui| { + // TODO: Set scroll area width to available width egui::ScrollArea::horizontal() .show(ui, |ui| { ui.horizontal(|ui| { @@ -75,9 +78,20 @@ impl FileExplorer { egui::Button::new("projects")); }); }); - }) + }); - // TODO: Search bar + egui::Frame::default() + .stroke(egui::Stroke::new(1.0, egui::Color32::GRAY)) + .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .rounding(egui::Rounding::from(5.0)) + .show(ui, |ui| { + ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { + ui.add_space(ctx.style().spacing.item_spacing.y); + ui.label("🔍"); + ui.add_sized(egui::Vec2::new(120.0, ui.available_height()), + egui::TextEdit::singleline(&mut self.search_value)); + }); + }); }); ui.add_space(ctx.style().spacing.item_spacing.y); From e86657351e4dd36eaa835433358fcd3660f125db Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 14 Jan 2024 22:04:39 +0100 Subject: [PATCH 009/124] Update top panel stroke --- src/file_explorer.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index c60ebce8..1bbce699 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -53,7 +53,7 @@ impl FileExplorer { // Current path display egui::Frame::default() - .stroke(egui::Stroke::new(1.0, egui::Color32::GRAY)) + .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) .rounding(egui::Rounding::from(5.0)) .show(ui, |ui| { @@ -81,7 +81,7 @@ impl FileExplorer { }); egui::Frame::default() - .stroke(egui::Stroke::new(1.0, egui::Color32::GRAY)) + .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) .rounding(egui::Rounding::from(5.0)) .show(ui, |ui| { From 62852d967e5b3df48371ad21894855309d488cea Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 14 Jan 2024 22:20:27 +0100 Subject: [PATCH 010/124] Add UI of central panel --- src/file_explorer.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 1bbce699..e47fde93 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -130,7 +130,15 @@ impl FileExplorer { } fn update_central_panel(&mut self, ui: &mut egui::Ui) { - ui.label("This is the central panel!"); + // NOTE: These are currently only hardcoded test values! + let _ = ui.selectable_label(false, "🗀 projects"); + let _ = ui.selectable_label(false, "🗀 documents"); + let _ = ui.selectable_label(false, "🗀 images"); + let _ = ui.selectable_label(false, "🗀 music"); + + let _ = ui.selectable_label(false, "🖹 some_config.txt"); + let _ = ui.selectable_label(false, "🖹 README.md"); + let _ = ui.selectable_label(false, "🖹 LICENSE.md"); } } From 5540ee563e4b8312b9f108ec5dcf35bc3abbf5de Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 14 Jan 2024 22:22:44 +0100 Subject: [PATCH 011/124] Remove unused style update --- src/file_explorer.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index e47fde93..bb9f3628 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -13,8 +13,6 @@ impl FileExplorer { egui::Window::new("File explorer") .default_size([800.0, 500.0]) .show(&ctx, |ui| { - ui.style_mut().spacing.window_margin = egui::Margin::symmetric(0.0, 0.0); - egui::TopBottomPanel::top("fe_top_panel") .resizable(false) .show_inside(ui, |ui| { From 5321c51938b0ad6a62f526b6f3826fa0614f69af Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 14 Jan 2024 22:29:26 +0100 Subject: [PATCH 012/124] Fix linter errors --- src/file_explorer.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index bb9f3628..ed8f2cbf 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -3,6 +3,12 @@ pub struct FileExplorer { search_value: String } +impl Default for FileExplorer { + fn default() -> Self { + Self::new() + } +} + impl FileExplorer { pub fn new() -> Self { FileExplorer { search_value: String::new() } @@ -12,7 +18,7 @@ impl FileExplorer { // TODO: Make window title and options configurable egui::Window::new("File explorer") .default_size([800.0, 500.0]) - .show(&ctx, |ui| { + .show(ctx, |ui| { egui::TopBottomPanel::top("fe_top_panel") .resizable(false) .show_inside(ui, |ui| { From 4a3a0712242919960d5dfa506769d0b1341f5eb4 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 14 Jan 2024 22:46:21 +0100 Subject: [PATCH 013/124] Add UI of bottom panel --- src/file_explorer.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index ed8f2cbf..7d907fb9 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -36,7 +36,7 @@ impl FileExplorer { egui::TopBottomPanel::bottom("fe_bottom_panel") .resizable(false) .show_inside(ui, |ui| { - self.update_bottom_panel(ui); + self.update_bottom_panel(ctx, ui); }); egui::CentralPanel::default().show_inside(ui, |ui| { @@ -129,8 +129,20 @@ impl FileExplorer { egui::Button::new("🗀 Pictures")); } - fn update_bottom_panel(&mut self, ui: &mut egui::Ui) { - ui.label("This is the bottom panel!"); + fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); + + ui.add_space(5.0); + + ui.horizontal(|ui|{ + ui.label("Selected item: Desktop"); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { + let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); + ui.add_space(ctx.style().spacing.item_spacing.y); + let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")); + }); + }); } fn update_central_panel(&mut self, ui: &mut egui::Ui) { From 9023fc351ac9c21bc3daa1aa8eb19b2f879849a5 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 14 Jan 2024 23:30:00 +0100 Subject: [PATCH 014/124] Dynamically load directory content --- examples/sandbox/src/main.rs | 6 ++-- src/file_explorer.rs | 55 +++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index c6c64385..2b68619a 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -7,9 +7,11 @@ struct MyApp { impl MyApp { pub fn new(_cc: &eframe::CreationContext) -> Self { - Self { + let mut obj = Self { file_explorer: FileExplorer::new() - } + }; + obj.file_explorer.open(); + obj } } diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 7d907fb9..fbffadc7 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,5 +1,7 @@ +use std::{fs, io}; pub struct FileExplorer { + directory_content: Vec, search_value: String } @@ -11,7 +13,15 @@ impl Default for FileExplorer { impl FileExplorer { pub fn new() -> Self { - FileExplorer { search_value: String::new() } + FileExplorer { + directory_content: vec![], + search_value: String::new() } + } + + // TODO: Enable option to set initial directory + pub fn open(&mut self) { + // TODO: Error handling + let _ = self.load_directory("./"); } pub fn update(&mut self, ctx: &egui::Context) { @@ -146,15 +156,40 @@ impl FileExplorer { } fn update_central_panel(&mut self, ui: &mut egui::Ui) { - // NOTE: These are currently only hardcoded test values! - let _ = ui.selectable_label(false, "🗀 projects"); - let _ = ui.selectable_label(false, "🗀 documents"); - let _ = ui.selectable_label(false, "🗀 images"); - let _ = ui.selectable_label(false, "🗀 music"); - - let _ = ui.selectable_label(false, "🖹 some_config.txt"); - let _ = ui.selectable_label(false, "🖹 README.md"); - let _ = ui.selectable_label(false, "🖹 LICENSE.md"); + for item in self.directory_content.iter() { + let path = item.path(); + + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹" + }; + + // Is there a way to write this better? + let file_name = match path.file_name() { + Some(x) => { + match x.to_str() { + Some(v) => v, + _ => continue + } + }, + _ => continue + }; + + let _ = ui.selectable_label(false, format!("{} {}", icon, file_name)); + } } + fn load_directory(&mut self, path: &str) -> io::Result<()> { + let paths = fs::read_dir(path)?; + + self.directory_content.clear(); + for path in paths { + match path { + Ok(entry) => self.directory_content.push(entry), + _ => continue + }; + } + + Ok(()) + } } From dc3dbe62c60cfd10524b40b1014fd6e93b16221f Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 21:54:56 +0100 Subject: [PATCH 015/124] Update design of left panel --- src/file_explorer.rs | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index fbffadc7..446f378f 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -112,31 +112,25 @@ impl FileExplorer { } fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - ui.label("Drives:"); + ui.label("Places"); // NOTE: These are currently only hardcoded test values! - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::Button::new("(C:)")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::Button::new("Toshiba(D:)")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::new("Samsung 980..(E:)")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::Button::new("(F:)")); + // TODO: Align button text to the left! + let _ = ui.selectable_label(false, "🏠 Home"); + let _ = ui.selectable_label(false, "🗐 Documents"); + let _ = ui.selectable_label(false, "📥 Downloads"); + let _ = ui.selectable_label(false, "🎵 Music"); + let _ = ui.selectable_label(false, "🖼 Pictures"); + let _ = ui.selectable_label(false, "🎞 Videos"); ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - ui.label("User:"); + ui.label("Devices"); - // NOTE: These are currently only hardcoded test values! - // TODO: Align button text to the left! - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::new("🗀 Desktop")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::new("🗀 Documents")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::new("🗀 Downloads")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::new("🗀 Music")); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::Button::new("🗀 Pictures")); + let _ = ui.selectable_label(false, "🖴 (C:)"); + let _ = ui.selectable_label(false, "🖴 Toshiba(D:)"); + let _ = ui.selectable_label(false, "🖴 Samsung 980..(E:)"); + let _ = ui.selectable_label(false, "🖴 (F:)"); } fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { From cf5e5bafa49ad0727c63b1e621c75cea0d90919f Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 22:23:07 +0100 Subject: [PATCH 016/124] Add dependency directories --- Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 5a299fac..05eed3ab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,6 @@ edition = "2021" [dependencies] egui = "0.25.0" + +# Used to fetch user folders +directories = "5.0" From 950fc4fd924e5bbac7de7fbe415ab2e5779dd92a Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 22:23:19 +0100 Subject: [PATCH 017/124] Dynamically load user directories --- src/file_explorer.rs | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 446f378f..bc34df31 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,7 +1,9 @@ use std::{fs, io}; +use directories::UserDirs; pub struct FileExplorer { directory_content: Vec, + user_directories: Option, search_value: String } @@ -15,6 +17,7 @@ impl FileExplorer { pub fn new() -> Self { FileExplorer { directory_content: vec![], + user_directories: UserDirs::new(), search_value: String::new() } } @@ -112,16 +115,7 @@ impl FileExplorer { } fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - ui.label("Places"); - - // NOTE: These are currently only hardcoded test values! - // TODO: Align button text to the left! - let _ = ui.selectable_label(false, "🏠 Home"); - let _ = ui.selectable_label(false, "🗐 Documents"); - let _ = ui.selectable_label(false, "📥 Downloads"); - let _ = ui.selectable_label(false, "🎵 Music"); - let _ = ui.selectable_label(false, "🖼 Pictures"); - let _ = ui.selectable_label(false, "🎞 Videos"); + self.update_user_directories(ui); ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); @@ -173,6 +167,30 @@ impl FileExplorer { } } + fn update_user_directories(&mut self, ui: &mut egui::Ui) { + if let Some(dirs) = &self.user_directories { + ui.label("Places"); + + let _ = ui.selectable_label(false, "🏠 Home"); + + if dirs.document_dir().is_some() { + let _ = ui.selectable_label(false, "🗐 Documents"); + } + if dirs.download_dir().is_some() { + let _ = ui.selectable_label(false, "📥 Downloads"); + } + if dirs.audio_dir().is_some() { + let _ = ui.selectable_label(false, "🎵 Audio"); + } + if dirs.picture_dir().is_some() { + let _ = ui.selectable_label(false, "🖼 Pictures"); + } + if dirs.video_dir().is_some() { + let _ = ui.selectable_label(false, "🎞 Videos"); + } + } + } + fn load_directory(&mut self, path: &str) -> io::Result<()> { let paths = fs::read_dir(path)?; From f78ca55a6e2756d8f10bf826ebd1f51881c9587e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 22:28:17 +0100 Subject: [PATCH 018/124] Add desktop user directory --- src/file_explorer.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index bc34df31..7da30a39 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -173,6 +173,9 @@ impl FileExplorer { let _ = ui.selectable_label(false, "🏠 Home"); + if dirs.desktop_dir().is_some() { + let _ = ui.selectable_label(false, "🖵 Desktop"); + } if dirs.document_dir().is_some() { let _ = ui.selectable_label(false, "🗐 Documents"); } From 3ae99accea302321767d8d6d8edf2960159d626b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 22:44:32 +0100 Subject: [PATCH 019/124] Implement user directories action --- src/file_explorer.rs | 48 ++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 7da30a39..076d9e8b 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,4 +1,4 @@ -use std::{fs, io}; +use std::{fs, io, path::Path}; use directories::UserDirs; pub struct FileExplorer { @@ -24,7 +24,7 @@ impl FileExplorer { // TODO: Enable option to set initial directory pub fn open(&mut self) { // TODO: Error handling - let _ = self.load_directory("./"); + let _ = self.load_directory(Path::new("./")); } pub fn update(&mut self, ctx: &egui::Context) { @@ -168,33 +168,47 @@ impl FileExplorer { } fn update_user_directories(&mut self, ui: &mut egui::Ui) { - if let Some(dirs) = &self.user_directories { + if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); - let _ = ui.selectable_label(false, "🏠 Home"); + if ui.selectable_label(false, "🏠 Home").clicked() { + let _ = self.load_directory(dirs.home_dir()); + } - if dirs.desktop_dir().is_some() { - let _ = ui.selectable_label(false, "🖵 Desktop"); + if let Some(path) = dirs.desktop_dir() { + if ui.selectable_label(false, "🖵 Desktop").clicked() { + let _ = self.load_directory(path); + } } - if dirs.document_dir().is_some() { - let _ = ui.selectable_label(false, "🗐 Documents"); + if let Some(path) = dirs.document_dir() { + if ui.selectable_label(false, "🗐 Documents").clicked() { + let _ = self.load_directory(path); + } } - if dirs.download_dir().is_some() { - let _ = ui.selectable_label(false, "📥 Downloads"); + if let Some(path) = dirs.download_dir() { + if ui.selectable_label(false, "📥 Downloads").clicked() { + let _ = self.load_directory(path); + } } - if dirs.audio_dir().is_some() { - let _ = ui.selectable_label(false, "🎵 Audio"); + if let Some(path) = dirs.audio_dir() { + if ui.selectable_label(false, "🎵 Audio").clicked() { + let _ = self.load_directory(path); + } } - if dirs.picture_dir().is_some() { - let _ = ui.selectable_label(false, "🖼 Pictures"); + if let Some(path) = dirs.picture_dir() { + if ui.selectable_label(false, "🖼 Pictures").clicked() { + let _ = self.load_directory(path); + } } - if dirs.video_dir().is_some() { - let _ = ui.selectable_label(false, "🎞 Videos"); + if let Some(path) = dirs.video_dir() { + if ui.selectable_label(false, "🎞 Videos").clicked() { + let _ = self.load_directory(path); + } } } } - fn load_directory(&mut self, path: &str) -> io::Result<()> { + fn load_directory(&mut self, path: &Path) -> io::Result<()> { let paths = fs::read_dir(path)?; self.directory_content.clear(); From 268807d956714ad5db4fd7b5d4b802b924c69d47 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 22:49:18 +0100 Subject: [PATCH 020/124] Add main content scroll area --- src/file_explorer.rs | 46 ++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 076d9e8b..490d6bcf 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -144,27 +144,31 @@ impl FileExplorer { } fn update_central_panel(&mut self, ui: &mut egui::Ui) { - for item in self.directory_content.iter() { - let path = item.path(); - - let icon = match path.is_dir() { - true => "🗀", - _ => "🖹" - }; - - // Is there a way to write this better? - let file_name = match path.file_name() { - Some(x) => { - match x.to_str() { - Some(v) => v, - _ => continue - } - }, - _ => continue - }; - - let _ = ui.selectable_label(false, format!("{} {}", icon, file_name)); - } + egui::containers::ScrollArea::vertical() + .auto_shrink([false, false]) + .show(ui, |ui| { + for item in self.directory_content.iter() { + let path = item.path(); + + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹" + }; + + // Is there a way to write this better? + let file_name = match path.file_name() { + Some(x) => { + match x.to_str() { + Some(v) => v, + _ => continue + } + }, + _ => continue + }; + + let _ = ui.selectable_label(false, format!("{} {}", icon, file_name)); + } + }); } fn update_user_directories(&mut self, ui: &mut egui::Ui) { From 6aa988027f8e3d6aab4e663a89d9e9211944be4f Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 15 Jan 2024 22:55:51 +0100 Subject: [PATCH 021/124] Implement selected of user directories --- src/file_explorer.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 490d6bcf..b5d437d8 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,7 +1,10 @@ -use std::{fs, io, path::Path}; +use std::{fs, io}; +use std::path::{Path, PathBuf}; + use directories::UserDirs; pub struct FileExplorer { + current_directory: PathBuf, directory_content: Vec, user_directories: Option, search_value: String @@ -16,6 +19,7 @@ impl Default for FileExplorer { impl FileExplorer { pub fn new() -> Self { FileExplorer { + current_directory: PathBuf::from("./"), directory_content: vec![], user_directories: UserDirs::new(), search_value: String::new() } @@ -175,37 +179,38 @@ impl FileExplorer { if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); - if ui.selectable_label(false, "🏠 Home").clicked() { + if ui.selectable_label(self.current_directory == dirs.home_dir(), + "🏠 Home").clicked() { let _ = self.load_directory(dirs.home_dir()); } if let Some(path) = dirs.desktop_dir() { - if ui.selectable_label(false, "🖵 Desktop").clicked() { + if ui.selectable_label(self.current_directory == path, "🖵 Desktop").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.document_dir() { - if ui.selectable_label(false, "🗐 Documents").clicked() { + if ui.selectable_label(self.current_directory == path, "🗐 Documents").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.download_dir() { - if ui.selectable_label(false, "📥 Downloads").clicked() { + if ui.selectable_label(self.current_directory == path, "📥 Downloads").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.audio_dir() { - if ui.selectable_label(false, "🎵 Audio").clicked() { + if ui.selectable_label(self.current_directory == path, "🎵 Audio").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.picture_dir() { - if ui.selectable_label(false, "🖼 Pictures").clicked() { + if ui.selectable_label(self.current_directory == path, "🖼 Pictures").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.video_dir() { - if ui.selectable_label(false, "🎞 Videos").clicked() { + if ui.selectable_label(self.current_directory == path, "🎞 Videos").clicked() { let _ = self.load_directory(path); } } @@ -215,7 +220,9 @@ impl FileExplorer { fn load_directory(&mut self, path: &Path) -> io::Result<()> { let paths = fs::read_dir(path)?; + self.current_directory = PathBuf::from(path); self.directory_content.clear(); + for path in paths { match path { Ok(entry) => self.directory_content.push(entry), From 3147499b5b5837152810c4b433a97b9548eed8f9 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 16 Jan 2024 22:53:39 +0100 Subject: [PATCH 022/124] Implement douple click of directory items --- src/file_explorer.rs | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index b5d437d8..d0d09e57 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -5,7 +5,7 @@ use directories::UserDirs; pub struct FileExplorer { current_directory: PathBuf, - directory_content: Vec, + directory_content: Vec, user_directories: Option, search_value: String } @@ -151,9 +151,15 @@ impl FileExplorer { egui::containers::ScrollArea::vertical() .auto_shrink([false, false]) .show(ui, |ui| { - for item in self.directory_content.iter() { - let path = item.path(); - + // Temporarily take ownership of the directory contents to be able to + // update it in the for loop using load_directory. + // Otherwise we would get an error that `*self` cannot be borrowed as mutable + // more than once at a time. + // Make sure to return the function after updating the directory_content, + // otherwise the change will be overwritten with the last statement of the function. + let mut data = std::mem::take(&mut self.directory_content); + + for path in data.iter_mut() { let icon = match path.is_dir() { true => "🗀", _ => "🖹" @@ -170,8 +176,23 @@ impl FileExplorer { _ => continue }; - let _ = ui.selectable_label(false, format!("{} {}", icon, file_name)); + let response = ui.selectable_label(false, format!("{} {}", icon, file_name)); + + if response.clicked() { + // Select directory or file + } + + if response.double_clicked() { + if path.is_dir() { + let _ = self.load_directory(&path); + return; + } + + // Select file and close file explorer + } } + + self.directory_content = data; }); } @@ -225,11 +246,13 @@ impl FileExplorer { for path in paths { match path { - Ok(entry) => self.directory_content.push(entry), + Ok(entry) => self.directory_content.push(entry.path()), _ => continue }; } + // TODO: Sort content to display folders first + Ok(()) } } From 4fe4d9b0d876653712e67af2dd2e4be8799e90fe Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 16 Jan 2024 23:20:39 +0100 Subject: [PATCH 023/124] Implement selection of directory items --- src/file_explorer.rs | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index d0d09e57..768d4035 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -4,9 +4,10 @@ use std::path::{Path, PathBuf}; use directories::UserDirs; pub struct FileExplorer { + user_directories: Option, current_directory: PathBuf, directory_content: Vec, - user_directories: Option, + selected_item: Option, search_value: String } @@ -19,9 +20,10 @@ impl Default for FileExplorer { impl FileExplorer { pub fn new() -> Self { FileExplorer { + user_directories: UserDirs::new(), current_directory: PathBuf::from("./"), directory_content: vec![], - user_directories: UserDirs::new(), + selected_item: None, search_value: String::new() } } @@ -137,7 +139,17 @@ impl FileExplorer { ui.add_space(5.0); ui.horizontal(|ui|{ - ui.label("Selected item: Desktop"); + let mut selected = String::from("Selected item:"); + + if let Some(x) = &self.selected_item { + if let Some(x) = x.file_name() { + if let Some(x) = x.to_str() { + selected = format!("Selected item: {}", x); + } + } + } + + ui.label(selected); ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); @@ -157,9 +169,9 @@ impl FileExplorer { // more than once at a time. // Make sure to return the function after updating the directory_content, // otherwise the change will be overwritten with the last statement of the function. - let mut data = std::mem::take(&mut self.directory_content); + let data = std::mem::take(&mut self.directory_content); - for path in data.iter_mut() { + for path in data.iter() { let icon = match path.is_dir() { true => "🗀", _ => "🖹" @@ -176,10 +188,15 @@ impl FileExplorer { _ => continue }; - let response = ui.selectable_label(false, format!("{} {}", icon, file_name)); + let mut selected = false; + if let Some(x) = &self.selected_item { + selected = x == path; + } + + let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); if response.clicked() { - // Select directory or file + self.selected_item = Some(path.clone()); } if response.double_clicked() { @@ -188,7 +205,8 @@ impl FileExplorer { return; } - // Select file and close file explorer + self.selected_item = Some(path.clone()); + // TODO: Close file explorer } } From 49d1969b897b507a38614ecddb427de2ef3d3c52 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 16 Jan 2024 23:22:14 +0100 Subject: [PATCH 024/124] Fix linter error --- src/file_explorer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 768d4035..6f092ef4 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -201,7 +201,7 @@ impl FileExplorer { if response.double_clicked() { if path.is_dir() { - let _ = self.load_directory(&path); + let _ = self.load_directory(path); return; } From 3ab65f649e9e7716d7774c31da00d5b76bac7e47 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 18 Jan 2024 21:04:06 +0100 Subject: [PATCH 025/124] Add Todo --- src/file_explorer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 6f092ef4..098e042a 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -270,6 +270,7 @@ impl FileExplorer { } // TODO: Sort content to display folders first + // TODO: Implement "Show hidden files and folders" option Ok(()) } From 2d4bfd0c776d135cdaf4bc1128210268475fec12 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 18 Jan 2024 23:06:03 +0100 Subject: [PATCH 026/124] Implement current path display --- src/file_explorer.rs | 47 ++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 098e042a..4aaef56c 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -66,6 +66,7 @@ impl FileExplorer { fn update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); + const SEARCH_INPUT_WIDTH: f32 = 120.0; ui.horizontal(|ui| { // Navigation buttons @@ -80,29 +81,41 @@ impl FileExplorer { .inner_margin(egui::Margin::symmetric(4.0, 4.0)) .rounding(egui::Rounding::from(5.0)) .show(ui, |ui| { - // TODO: Set scroll area width to available width + // TODO: Enable scrolling with mouse wheel egui::ScrollArea::horizontal() + .auto_shrink([false, false]) + .stick_to_right(true) + // TODO: Dynamically size scroll area to available width + .max_width(500.0) .show(ui, |ui| { ui.horizontal(|ui| { - // NOTE: These are currently only hardcoded test values! - let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), - egui::Button::new("home")); - ui.label(">"); + ui.style_mut().spacing.item_spacing.x /= 2.5; - let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), - egui::Button::new("user")); - ui.label(">"); + let data = std::mem::take(&mut self.current_directory); + let mut path = PathBuf::new(); - let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), - egui::Button::new("documents")); - ui.label(">"); + for (i, segment) in data.iter().enumerate() { + path.push(segment); - let _ = ui.add_sized(egui::Vec2::new(0.0, ui.available_height()), - egui::Button::new("projects")); + if i != 0 { + ui.label(">"); + } + + // TODO: Maybe use selectable_label instead of button? + // TODO: Write current directory (last item) in bold text + if ui.button(segment.to_str().unwrap_or_else(|| "")) + .clicked() { + let _ = self.load_directory(path.as_path()); + return; + } + } + + self.current_directory = data; + }); }); - }); }); + // Search bar egui::Frame::default() .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) @@ -111,8 +124,8 @@ impl FileExplorer { ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { ui.add_space(ctx.style().spacing.item_spacing.y); ui.label("🔍"); - ui.add_sized(egui::Vec2::new(120.0, ui.available_height()), - egui::TextEdit::singleline(&mut self.search_value)); + ui.add_sized(egui::Vec2::new(SEARCH_INPUT_WIDTH, 0.0), + egui::TextEdit::singleline(&mut self.search_value)); }); }); }); @@ -259,7 +272,7 @@ impl FileExplorer { fn load_directory(&mut self, path: &Path) -> io::Result<()> { let paths = fs::read_dir(path)?; - self.current_directory = PathBuf::from(path); + self.current_directory = fs::canonicalize(path)?; self.directory_content.clear(); for path in paths { From 3039f9907bd65f79318fbea34d51acf7679016b0 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 18 Jan 2024 23:11:13 +0100 Subject: [PATCH 027/124] Fix linter error --- src/file_explorer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index 4aaef56c..a27bc445 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -103,7 +103,7 @@ impl FileExplorer { // TODO: Maybe use selectable_label instead of button? // TODO: Write current directory (last item) in bold text - if ui.button(segment.to_str().unwrap_or_else(|| "")) + if ui.button(segment.to_str().unwrap_or("")) .clicked() { let _ = self.load_directory(path.as_path()); return; From c734eea934601c2a57c3230367feb13fa6e7cd73 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 20 Jan 2024 23:27:26 +0100 Subject: [PATCH 028/124] Implement next and previous buttons --- src/file_explorer.rs | 122 ++++++++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 30 deletions(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index a27bc445..a77c6678 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,3 +1,4 @@ +use std::io::Error; use std::{fs, io}; use std::path::{Path, PathBuf}; @@ -5,7 +6,8 @@ use directories::UserDirs; pub struct FileExplorer { user_directories: Option, - current_directory: PathBuf, + directory_stack: Vec, + directory_offset: usize, directory_content: Vec, selected_item: Option, search_value: String @@ -21,10 +23,12 @@ impl FileExplorer { pub fn new() -> Self { FileExplorer { user_directories: UserDirs::new(), - current_directory: PathBuf::from("./"), + directory_stack: vec![], + directory_offset: 0, directory_content: vec![], selected_item: None, - search_value: String::new() } + search_value: String::new() + } } // TODO: Enable option to set initial directory @@ -71,8 +75,17 @@ impl FileExplorer { ui.horizontal(|ui| { // Navigation buttons let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<-")); - let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<")); - let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new(">")); + + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<")).clicked() && + self.directory_offset + 1 < self.directory_stack.len() { + let _ = self.load_previous_directory(); + } + + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new(">")).clicked() && + self.directory_offset != 0 { + let _ = self.load_next_directory(); + } + let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("+")); // Current path display @@ -91,26 +104,25 @@ impl FileExplorer { ui.horizontal(|ui| { ui.style_mut().spacing.item_spacing.x /= 2.5; - let data = std::mem::take(&mut self.current_directory); let mut path = PathBuf::new(); - - for (i, segment) in data.iter().enumerate() { - path.push(segment); - - if i != 0 { - ui.label(">"); - } - - // TODO: Maybe use selectable_label instead of button? - // TODO: Write current directory (last item) in bold text - if ui.button(segment.to_str().unwrap_or("")) - .clicked() { - let _ = self.load_directory(path.as_path()); - return; + + if let Some(data) = self.current_directory() { + for (i, segment) in data.iter().enumerate() { + path.push(segment); + + if i != 0 { + ui.label(">"); + } + + // TODO: Maybe use selectable_label instead of button? + // TODO: Write current directory (last item) in bold text + if ui.button(segment.to_str().unwrap_or("")) + .clicked() { + let _ = self.load_directory(path.as_path()); + return; + } } } - - self.current_directory = data; }); }); }); @@ -231,48 +243,98 @@ impl FileExplorer { if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); - if ui.selectable_label(self.current_directory == dirs.home_dir(), + if ui.selectable_label(self.current_directory() == Some(dirs.home_dir()), "🏠 Home").clicked() { let _ = self.load_directory(dirs.home_dir()); } if let Some(path) = dirs.desktop_dir() { - if ui.selectable_label(self.current_directory == path, "🖵 Desktop").clicked() { + if ui.selectable_label(self.current_directory() == Some(path), + "🖵 Desktop").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.document_dir() { - if ui.selectable_label(self.current_directory == path, "🗐 Documents").clicked() { + if ui.selectable_label(self.current_directory() == Some(path), + "🗐 Documents").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.download_dir() { - if ui.selectable_label(self.current_directory == path, "📥 Downloads").clicked() { + if ui.selectable_label(self.current_directory() == Some(path), + "📥 Downloads").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.audio_dir() { - if ui.selectable_label(self.current_directory == path, "🎵 Audio").clicked() { + if ui.selectable_label(self.current_directory() == Some(path), + "🎵 Audio").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.picture_dir() { - if ui.selectable_label(self.current_directory == path, "🖼 Pictures").clicked() { + if ui.selectable_label(self.current_directory() == Some(path), + "🖼 Pictures").clicked() { let _ = self.load_directory(path); } } if let Some(path) = dirs.video_dir() { - if ui.selectable_label(self.current_directory == path, "🎞 Videos").clicked() { + if ui.selectable_label(self.current_directory() == Some(path), + "🎞 Videos").clicked() { let _ = self.load_directory(path); } } } } + fn current_directory(&self) -> Option<&Path> { + if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { + return Some(x.as_path()) + } + + None + } + + fn load_next_directory(&mut self) -> io::Result<()> { + if self.directory_offset == 0 { + // There is no next directory that can be loaded + return Ok(()); + } + + self.directory_offset -= 1; + + // Copy path and load directory + let path = self.current_directory().unwrap().to_path_buf(); + self.load_directory_content(path.as_path()) + } + + fn load_previous_directory(&mut self) -> io::Result<()> { + if self.directory_offset + 1 >= self.directory_stack.len() { + // There is no previous directory that can be loaded + return Ok(()) + } + + self.directory_offset += 1; + + // Copy path and load directory + let path = self.current_directory().unwrap().to_path_buf(); + self.load_directory_content(path.as_path()) + } + fn load_directory(&mut self, path: &Path) -> io::Result<()> { + if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { + self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); + } + + self.directory_stack.push(fs::canonicalize(path)?); + self.directory_offset = 0; + + self.load_directory_content(path) + } + + fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { let paths = fs::read_dir(path)?; - self.current_directory = fs::canonicalize(path)?; self.directory_content.clear(); for path in paths { From f562c8db8cfc7a65e1843ded6f59c68567b0515b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 20 Jan 2024 23:28:01 +0100 Subject: [PATCH 029/124] Remove unused import --- src/file_explorer.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/file_explorer.rs b/src/file_explorer.rs index a77c6678..80b2d264 100644 --- a/src/file_explorer.rs +++ b/src/file_explorer.rs @@ -1,4 +1,3 @@ -use std::io::Error; use std::{fs, io}; use std::path::{Path, PathBuf}; From 070a9e3a7b31e569f42ac248d7c7ad297081d235 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 17:52:42 +0100 Subject: [PATCH 030/124] Move file explorer to lib.rs --- src/file_explorer.rs | 351 ----------------------------------------- src/lib.rs | 364 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 362 insertions(+), 353 deletions(-) delete mode 100644 src/file_explorer.rs diff --git a/src/file_explorer.rs b/src/file_explorer.rs deleted file mode 100644 index 80b2d264..00000000 --- a/src/file_explorer.rs +++ /dev/null @@ -1,351 +0,0 @@ -use std::{fs, io}; -use std::path::{Path, PathBuf}; - -use directories::UserDirs; - -pub struct FileExplorer { - user_directories: Option, - directory_stack: Vec, - directory_offset: usize, - directory_content: Vec, - selected_item: Option, - search_value: String -} - -impl Default for FileExplorer { - fn default() -> Self { - Self::new() - } -} - -impl FileExplorer { - pub fn new() -> Self { - FileExplorer { - user_directories: UserDirs::new(), - directory_stack: vec![], - directory_offset: 0, - directory_content: vec![], - selected_item: None, - search_value: String::new() - } - } - - // TODO: Enable option to set initial directory - pub fn open(&mut self) { - // TODO: Error handling - let _ = self.load_directory(Path::new("./")); - } - - pub fn update(&mut self, ctx: &egui::Context) { - // TODO: Make window title and options configurable - egui::Window::new("File explorer") - .default_size([800.0, 500.0]) - .show(ctx, |ui| { - egui::TopBottomPanel::top("fe_top_panel") - .resizable(false) - .show_inside(ui, |ui| { - self.update_top_panel(ctx, ui); - }); - - egui::SidePanel::left("fe_left_panel") - .resizable(true) - .default_width(150.0) - .width_range(80.0..=300.0) - .show_inside(ui, |ui| { - self.update_left_panel(ctx, ui); - }); - - egui::TopBottomPanel::bottom("fe_bottom_panel") - .resizable(false) - .show_inside(ui, |ui| { - self.update_bottom_panel(ctx, ui); - }); - - egui::CentralPanel::default().show_inside(ui, |ui| { - self.update_central_panel(ui); - }); - }); - } - - fn update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); - const SEARCH_INPUT_WIDTH: f32 = 120.0; - - ui.horizontal(|ui| { - // Navigation buttons - let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<-")); - - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("<")).clicked() && - self.directory_offset + 1 < self.directory_stack.len() { - let _ = self.load_previous_directory(); - } - - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new(">")).clicked() && - self.directory_offset != 0 { - let _ = self.load_next_directory(); - } - - let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("+")); - - // Current path display - egui::Frame::default() - .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) - .inner_margin(egui::Margin::symmetric(4.0, 4.0)) - .rounding(egui::Rounding::from(5.0)) - .show(ui, |ui| { - // TODO: Enable scrolling with mouse wheel - egui::ScrollArea::horizontal() - .auto_shrink([false, false]) - .stick_to_right(true) - // TODO: Dynamically size scroll area to available width - .max_width(500.0) - .show(ui, |ui| { - ui.horizontal(|ui| { - ui.style_mut().spacing.item_spacing.x /= 2.5; - - let mut path = PathBuf::new(); - - if let Some(data) = self.current_directory() { - for (i, segment) in data.iter().enumerate() { - path.push(segment); - - if i != 0 { - ui.label(">"); - } - - // TODO: Maybe use selectable_label instead of button? - // TODO: Write current directory (last item) in bold text - if ui.button(segment.to_str().unwrap_or("")) - .clicked() { - let _ = self.load_directory(path.as_path()); - return; - } - } - } - }); - }); - }); - - // Search bar - egui::Frame::default() - .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) - .inner_margin(egui::Margin::symmetric(4.0, 4.0)) - .rounding(egui::Rounding::from(5.0)) - .show(ui, |ui| { - ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { - ui.add_space(ctx.style().spacing.item_spacing.y); - ui.label("🔍"); - ui.add_sized(egui::Vec2::new(SEARCH_INPUT_WIDTH, 0.0), - egui::TextEdit::singleline(&mut self.search_value)); - }); - }); - }); - - ui.add_space(ctx.style().spacing.item_spacing.y); - } - - fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - self.update_user_directories(ui); - - ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - - ui.label("Devices"); - - let _ = ui.selectable_label(false, "🖴 (C:)"); - let _ = ui.selectable_label(false, "🖴 Toshiba(D:)"); - let _ = ui.selectable_label(false, "🖴 Samsung 980..(E:)"); - let _ = ui.selectable_label(false, "🖴 (F:)"); - } - - fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); - - ui.add_space(5.0); - - ui.horizontal(|ui|{ - let mut selected = String::from("Selected item:"); - - if let Some(x) = &self.selected_item { - if let Some(x) = x.file_name() { - if let Some(x) = x.to_str() { - selected = format!("Selected item: {}", x); - } - } - } - - ui.label(selected); - - ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { - let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); - ui.add_space(ctx.style().spacing.item_spacing.y); - let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")); - }); - }); - } - - fn update_central_panel(&mut self, ui: &mut egui::Ui) { - egui::containers::ScrollArea::vertical() - .auto_shrink([false, false]) - .show(ui, |ui| { - // Temporarily take ownership of the directory contents to be able to - // update it in the for loop using load_directory. - // Otherwise we would get an error that `*self` cannot be borrowed as mutable - // more than once at a time. - // Make sure to return the function after updating the directory_content, - // otherwise the change will be overwritten with the last statement of the function. - let data = std::mem::take(&mut self.directory_content); - - for path in data.iter() { - let icon = match path.is_dir() { - true => "🗀", - _ => "🖹" - }; - - // Is there a way to write this better? - let file_name = match path.file_name() { - Some(x) => { - match x.to_str() { - Some(v) => v, - _ => continue - } - }, - _ => continue - }; - - let mut selected = false; - if let Some(x) = &self.selected_item { - selected = x == path; - } - - let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); - - if response.clicked() { - self.selected_item = Some(path.clone()); - } - - if response.double_clicked() { - if path.is_dir() { - let _ = self.load_directory(path); - return; - } - - self.selected_item = Some(path.clone()); - // TODO: Close file explorer - } - } - - self.directory_content = data; - }); - } - - fn update_user_directories(&mut self, ui: &mut egui::Ui) { - if let Some(dirs) = self.user_directories.clone() { - ui.label("Places"); - - if ui.selectable_label(self.current_directory() == Some(dirs.home_dir()), - "🏠 Home").clicked() { - let _ = self.load_directory(dirs.home_dir()); - } - - if let Some(path) = dirs.desktop_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🖵 Desktop").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.document_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🗐 Documents").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.download_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "📥 Downloads").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.audio_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🎵 Audio").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.picture_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🖼 Pictures").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.video_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🎞 Videos").clicked() { - let _ = self.load_directory(path); - } - } - } - } - - fn current_directory(&self) -> Option<&Path> { - if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { - return Some(x.as_path()) - } - - None - } - - fn load_next_directory(&mut self) -> io::Result<()> { - if self.directory_offset == 0 { - // There is no next directory that can be loaded - return Ok(()); - } - - self.directory_offset -= 1; - - // Copy path and load directory - let path = self.current_directory().unwrap().to_path_buf(); - self.load_directory_content(path.as_path()) - } - - fn load_previous_directory(&mut self) -> io::Result<()> { - if self.directory_offset + 1 >= self.directory_stack.len() { - // There is no previous directory that can be loaded - return Ok(()) - } - - self.directory_offset += 1; - - // Copy path and load directory - let path = self.current_directory().unwrap().to_path_buf(); - self.load_directory_content(path.as_path()) - } - - fn load_directory(&mut self, path: &Path) -> io::Result<()> { - if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { - self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); - } - - self.directory_stack.push(fs::canonicalize(path)?); - self.directory_offset = 0; - - self.load_directory_content(path) - } - - fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { - let paths = fs::read_dir(path)?; - - self.directory_content.clear(); - - for path in paths { - match path { - Ok(entry) => self.directory_content.push(entry.path()), - _ => continue - }; - } - - // TODO: Sort content to display folders first - // TODO: Implement "Show hidden files and folders" option - - Ok(()) - } -} diff --git a/src/lib.rs b/src/lib.rs index 5e8a391f..96e918cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,363 @@ +use std::{fs, io}; +use std::path::{Path, PathBuf}; -mod file_explorer; -pub use file_explorer::FileExplorer; +use directories::UserDirs; + +pub struct FileExplorer { + user_directories: Option, + directory_stack: Vec, + directory_offset: usize, + directory_content: Vec, + selected_item: Option, + search_value: String +} + +impl Default for FileExplorer { + fn default() -> Self { + Self::new() + } +} + +impl FileExplorer { + pub fn new() -> Self { + FileExplorer { + user_directories: UserDirs::new(), + directory_stack: vec![], + directory_offset: 0, + directory_content: vec![], + selected_item: None, + search_value: String::new() + } + } + + // TODO: Enable option to set initial directory + pub fn open(&mut self) { + // TODO: Error handling + let _ = self.load_directory(Path::new("./")); + } + + pub fn update(&mut self, ctx: &egui::Context) { + // TODO: Make window title and options configurable + egui::Window::new("File explorer") + .default_size([800.0, 500.0]) + .show(ctx, |ui| { + egui::TopBottomPanel::top("fe_top_panel") + .resizable(false) + .show_inside(ui, |ui| { + self.update_top_panel(ctx, ui); + }); + + egui::SidePanel::left("fe_left_panel") + .resizable(true) + .default_width(150.0) + .width_range(80.0..=300.0) + .show_inside(ui, |ui| { + self.update_left_panel(ctx, ui); + }); + + egui::TopBottomPanel::bottom("fe_bottom_panel") + .resizable(false) + .show_inside(ui, |ui| { + self.update_bottom_panel(ctx, ui); + }); + + egui::CentralPanel::default().show_inside(ui, |ui| { + self.update_central_panel(ui); + }); + }); + } + + fn update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); + const SEARCH_INPUT_WIDTH: f32 = 120.0; + + ui.horizontal(|ui| { + // Navigation buttons + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⏶")).clicked() { + let _ = self.load_parent(); + } + + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⏴")).clicked() && + self.directory_offset + 1 < self.directory_stack.len() { + let _ = self.load_previous_directory(); + } + + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⏵")).clicked() && + self.directory_offset != 0 { + let _ = self.load_next_directory(); + } + + let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("+")); + + // Current path display + egui::Frame::default() + .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) + .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .rounding(egui::Rounding::from(5.0)) + .show(ui, |ui| { + // TODO: Enable scrolling with mouse wheel + egui::ScrollArea::horizontal() + .auto_shrink([false, false]) + .stick_to_right(true) + // TODO: Dynamically size scroll area to available width + .max_width(500.0) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.style_mut().spacing.item_spacing.x /= 2.5; + + let mut path = PathBuf::new(); + + if let Some(data) = self.current_directory() { + for (i, segment) in data.iter().enumerate() { + path.push(segment); + + if i != 0 { + ui.label(">"); + } + + // TODO: Maybe use selectable_label instead of button? + // TODO: Write current directory (last item) in bold text + if ui.button(segment.to_str().unwrap_or("")) + .clicked() { + let _ = self.load_directory(path.as_path()); + return; + } + } + } + }); + }); + }); + + // Search bar + egui::Frame::default() + .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) + .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .rounding(egui::Rounding::from(5.0)) + .show(ui, |ui| { + ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { + ui.add_space(ctx.style().spacing.item_spacing.y); + ui.label("🔍"); + ui.add_sized(egui::Vec2::new(SEARCH_INPUT_WIDTH, 0.0), + egui::TextEdit::singleline(&mut self.search_value)); + }); + }); + }); + + ui.add_space(ctx.style().spacing.item_spacing.y); + } + + fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + self.update_user_directories(ui); + + ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); + + ui.label("Devices"); + + let _ = ui.selectable_label(false, "🖴 (C:)"); + let _ = ui.selectable_label(false, "🖴 Toshiba(D:)"); + let _ = ui.selectable_label(false, "🖴 Samsung 980..(E:)"); + let _ = ui.selectable_label(false, "🖴 (F:)"); + } + + fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); + + ui.add_space(5.0); + + ui.horizontal(|ui|{ + let mut selected = String::from("Selected item:"); + + if let Some(x) = &self.selected_item { + if let Some(x) = x.file_name() { + if let Some(x) = x.to_str() { + selected = format!("Selected item: {}", x); + } + } + } + + ui.label(selected); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { + let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); + ui.add_space(ctx.style().spacing.item_spacing.y); + let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")); + }); + }); + } + + fn update_central_panel(&mut self, ui: &mut egui::Ui) { + egui::containers::ScrollArea::vertical() + .auto_shrink([false, false]) + .show(ui, |ui| { + // Temporarily take ownership of the directory contents to be able to + // update it in the for loop using load_directory. + // Otherwise we would get an error that `*self` cannot be borrowed as mutable + // more than once at a time. + // Make sure to return the function after updating the directory_content, + // otherwise the change will be overwritten with the last statement of the function. + let data = std::mem::take(&mut self.directory_content); + + for path in data.iter() { + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹" + }; + + // Is there a way to write this better? + let file_name = match path.file_name() { + Some(x) => { + match x.to_str() { + Some(v) => v, + _ => continue + } + }, + _ => continue + }; + + let mut selected = false; + if let Some(x) = &self.selected_item { + selected = x == path; + } + + let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); + + if response.clicked() { + self.selected_item = Some(path.clone()); + } + + if response.double_clicked() { + if path.is_dir() { + let _ = self.load_directory(path); + return; + } + + self.selected_item = Some(path.clone()); + // TODO: Close file explorer + } + } + + self.directory_content = data; + }); + } + + fn update_user_directories(&mut self, ui: &mut egui::Ui) { + if let Some(dirs) = self.user_directories.clone() { + ui.label("Places"); + + if ui.selectable_label(self.current_directory() == Some(dirs.home_dir()), + "🏠 Home").clicked() { + let _ = self.load_directory(dirs.home_dir()); + } + + if let Some(path) = dirs.desktop_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🖵 Desktop").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.document_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🗐 Documents").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.download_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "📥 Downloads").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.audio_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🎵 Audio").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.picture_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🖼 Pictures").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.video_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🎞 Videos").clicked() { + let _ = self.load_directory(path); + } + } + } + } + + fn current_directory(&self) -> Option<&Path> { + if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { + return Some(x.as_path()) + } + + None + } + + fn load_next_directory(&mut self) -> io::Result<()> { + if self.directory_offset == 0 { + // There is no next directory that can be loaded + return Ok(()); + } + + self.directory_offset -= 1; + + // Copy path and load directory + let path = self.current_directory().unwrap().to_path_buf(); + self.load_directory_content(path.as_path()) + } + + fn load_previous_directory(&mut self) -> io::Result<()> { + if self.directory_offset + 1 >= self.directory_stack.len() { + // There is no previous directory that can be loaded + return Ok(()) + } + + self.directory_offset += 1; + + // Copy path and load directory + let path = self.current_directory().unwrap().to_path_buf(); + self.load_directory_content(path.as_path()) + } + + fn load_parent(&mut self) -> io::Result<()> { + if let Some(x) = self.current_directory() { + if let Some(x) = x.to_path_buf().parent() { + return self.load_directory(x); + } + } + + Ok(()) + } + + fn load_directory(&mut self, path: &Path) -> io::Result<()> { + if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { + self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); + } + + self.directory_stack.push(fs::canonicalize(path)?); + self.directory_offset = 0; + + self.load_directory_content(path) + } + + fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { + let paths = fs::read_dir(path)?; + + self.directory_content.clear(); + + for path in paths { + match path { + Ok(entry) => self.directory_content.push(entry.path()), + _ => continue + }; + } + + // TODO: Sort content to display folders first + // TODO: Implement "Show hidden files and folders" option + + Ok(()) + } +} From 3f4462b770ef7beb7a213f1e095d947685a90a39 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 17:58:59 +0100 Subject: [PATCH 031/124] Implement reload button --- src/lib.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 96e918cc..b8fb37b2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -128,6 +128,11 @@ impl FileExplorer { }); }); + // Reload button + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")).clicked() { + let _ = self.reaload_directory(); + } + // Search bar egui::Frame::default() .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) @@ -332,6 +337,14 @@ impl FileExplorer { Ok(()) } + fn reaload_directory(&mut self) -> io::Result<()> { + if let Some(x) = self.current_directory() { + return self.load_directory_content(x.to_path_buf().as_path()); + } + + Ok(()) + } + fn load_directory(&mut self, path: &Path) -> io::Result<()> { if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); From f9ddcf2b1354da2a2850f96711c21efd62681453 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 19:18:28 +0100 Subject: [PATCH 032/124] Implement search field --- src/lib.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b8fb37b2..d431586c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -203,11 +203,6 @@ impl FileExplorer { let data = std::mem::take(&mut self.directory_content); for path in data.iter() { - let icon = match path.is_dir() { - true => "🗀", - _ => "🖹" - }; - // Is there a way to write this better? let file_name = match path.file_name() { Some(x) => { @@ -219,6 +214,17 @@ impl FileExplorer { _ => continue }; + if !self.search_value.is_empty() { + if !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { + continue; + } + } + + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹" + }; + let mut selected = false; if let Some(x) = &self.selected_item { selected = x == path; From 9f3b5cf81c5bb5fa364f8889ac7c2eddef6166c1 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 19:21:04 +0100 Subject: [PATCH 033/124] Fix directory_stack Fixed directory_stack if the same directory is loaded multiple times in a raw. --- src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index d431586c..ee1200ef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -352,6 +352,14 @@ impl FileExplorer { } fn load_directory(&mut self, path: &Path) -> io::Result<()> { + // Do not load the same directory again. + // Use reload_directory if the content of the directory should be updated. + if let Some(x) = self.current_directory() { + if x == path { + return Ok(()); + } + } + if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); } From 98aaa6032c553813c8e895ab4f4b76fc04be914e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 19:22:21 +0100 Subject: [PATCH 034/124] Fix typo --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ee1200ef..db3a6904 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -130,7 +130,7 @@ impl FileExplorer { // Reload button if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")).clicked() { - let _ = self.reaload_directory(); + let _ = self.reload_directory(); } // Search bar @@ -343,7 +343,7 @@ impl FileExplorer { Ok(()) } - fn reaload_directory(&mut self) -> io::Result<()> { + fn reload_directory(&mut self) -> io::Result<()> { if let Some(x) = self.current_directory() { return self.load_directory_content(x.to_path_buf().as_path()); } From f3abdfe2c5ad53fd19678547397f34a565f58632 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 19:26:45 +0100 Subject: [PATCH 035/124] Fix linter error --- src/lib.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index db3a6904..6cc0993f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -214,10 +214,9 @@ impl FileExplorer { _ => continue }; - if !self.search_value.is_empty() { - if !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { - continue; - } + if !self.search_value.is_empty() && + !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { + continue; } let icon = match path.is_dir() { From 5025215c7af327b9f4646232076d7c5b7618e844 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 19:55:47 +0100 Subject: [PATCH 036/124] Load system disks --- Cargo.toml | 3 +++ src/lib.rs | 27 +++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 05eed3ab..28af2e55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,3 +15,6 @@ egui = "0.25.0" # Used to fetch user folders directories = "5.0" + +# Used to fetch disks +sysinfo = { version = "0.30.5", default-features = false } diff --git a/src/lib.rs b/src/lib.rs index 6cc0993f..65e40115 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,12 +2,16 @@ use std::{fs, io}; use std::path::{Path, PathBuf}; use directories::UserDirs; +use sysinfo::Disks; pub struct FileExplorer { user_directories: Option, + system_disks: Disks, + directory_stack: Vec, directory_offset: usize, directory_content: Vec, + selected_item: Option, search_value: String } @@ -22,9 +26,12 @@ impl FileExplorer { pub fn new() -> Self { FileExplorer { user_directories: UserDirs::new(), + system_disks: Disks::new_with_refreshed_list(), + directory_stack: vec![], directory_offset: 0, directory_content: vec![], + selected_item: None, search_value: String::new() } @@ -158,10 +165,22 @@ impl FileExplorer { ui.label("Devices"); - let _ = ui.selectable_label(false, "🖴 (C:)"); - let _ = ui.selectable_label(false, "🖴 Toshiba(D:)"); - let _ = ui.selectable_label(false, "🖴 Samsung 980..(E:)"); - let _ = ui.selectable_label(false, "🖴 (F:)"); + let disks = std::mem::take(&mut self.system_disks); + + for disk in &disks { + // TODO: Get display name of the devices. + // Currently on linux "/dev/sda1" is returned. + let name = match disk.name().to_str() { + Some(x) => x, + None => continue + }; + + if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { + let _ = self.load_directory(disk.mount_point()); + } + } + + self.system_disks = disks; } fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { From 0e56b7f877a6d8454a38725e20071f32603d9547 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 21 Jan 2024 23:11:49 +0100 Subject: [PATCH 037/124] Add disabled buttons --- src/lib.rs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 65e40115..c0c2df23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,18 +79,23 @@ impl FileExplorer { const SEARCH_INPUT_WIDTH: f32 = 120.0; ui.horizontal(|ui| { + // Navigation buttons - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⏶")).clicked() { - let _ = self.load_parent(); + if let Some(x) = self.current_directory() { + if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { + let _ = self.load_parent(); + } + } + else { + let _ = ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", false); } - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⏴")).clicked() && - self.directory_offset + 1 < self.directory_stack.len() { + if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏴", + self.directory_offset + 1 < self.directory_stack.len()) { let _ = self.load_previous_directory(); } - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⏵")).clicked() && - self.directory_offset != 0 { + if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏵", self.directory_offset != 0) { let _ = self.load_next_directory(); } @@ -406,3 +411,15 @@ impl FileExplorer { Ok(()) } } + +fn ui_button_enabled_disabled(ui: &mut egui::Ui, size: egui::Vec2, text: &str, + active: bool) -> bool { + if !active { + let c = ui.style().visuals.widgets.noninteractive.bg_fill; + let bg_color = egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100); + let _ = ui.add_sized(size, egui::Button::new(text).fill(bg_color)); + return false; + } + + ui.add_sized(size, egui::Button::new(text)).clicked() +} From d6387b799c815954e8537caaa378096aae737403 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 22 Jan 2024 21:34:47 +0100 Subject: [PATCH 038/124] Update size of left panel --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index c0c2df23..0f8579ec 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -57,7 +57,7 @@ impl FileExplorer { egui::SidePanel::left("fe_left_panel") .resizable(true) .default_width(150.0) - .width_range(80.0..=300.0) + .width_range(100.0..=400.0) .show_inside(ui, |ui| { self.update_left_panel(ctx, ui); }); From 3a26798b81753113c18b90d29ce00795be6228a5 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 22 Jan 2024 22:28:52 +0100 Subject: [PATCH 039/124] Update style of bottom panel --- src/lib.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0f8579ec..9298b856 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -194,23 +194,21 @@ impl FileExplorer { ui.add_space(5.0); ui.horizontal(|ui|{ - let mut selected = String::from("Selected item:"); + ui.label("Selected item:"); if let Some(x) = &self.selected_item { if let Some(x) = x.file_name() { if let Some(x) = x.to_str() { - selected = format!("Selected item: {}", x); + ui.colored_label(ui.style().visuals.selection.bg_fill, x); } } } + }); - ui.label(selected); - - ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { - let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); - ui.add_space(ctx.style().spacing.item_spacing.y); - let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")); - }); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { + let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); + ui.add_space(ctx.style().spacing.item_spacing.y); + let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")); }); } From 14318478c04d6fccbda35fcc51473bf4bdb8b7ef Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 22 Jan 2024 22:39:58 +0100 Subject: [PATCH 040/124] Add FileExplorerMode --- src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 9298b856..4bd36f3b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,13 @@ use std::path::{Path, PathBuf}; use directories::UserDirs; use sysinfo::Disks; +// NOTE: Currently not implemented, just an idea! +pub enum FileExplorerMode { + OpenFile, + OpenDirectory, + SaveFile +} + pub struct FileExplorer { user_directories: Option, system_disks: Disks, From 6d5a1dd4fdd93ca53cf3ee22cf44cc43ca1cc23b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 22 Jan 2024 23:16:21 +0100 Subject: [PATCH 041/124] Add create folder dialog (WIP) --- src/lib.rs | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4bd36f3b..42651d68 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,6 +19,9 @@ pub struct FileExplorer { directory_offset: usize, directory_content: Vec, + create_folder_dialog: bool, + create_folder_input: String, + selected_item: Option, search_value: String } @@ -39,8 +42,11 @@ impl FileExplorer { directory_offset: 0, directory_content: vec![], + create_folder_dialog: false, + create_folder_input: String::new(), + selected_item: None, - search_value: String::new() + search_value: String::new(), } } @@ -106,7 +112,10 @@ impl FileExplorer { let _ = self.load_next_directory(); } - let _ = ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("+")); + if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "+", !self.create_folder_dialog) { + self.create_folder_input.clear(); + self.create_folder_dialog = true; + } // Current path display egui::Frame::default() @@ -276,6 +285,25 @@ impl FileExplorer { } self.directory_content = data; + + if self.create_folder_dialog { + self.update_create_folder_dialog(ui); + } + }); + } + + fn update_create_folder_dialog(&mut self, ui: &mut egui::Ui) { + ui.horizontal(|ui| { + // TODO: Add "Create new folder" icon + ui.text_edit_singleline(&mut self.create_folder_input).scroll_to_me(None); + // TODO: Validate that the filename is unique + if ui.button("✔").clicked() { + // TODO: Create folder and append it to the end of directory_content + self.reset_create_folder_dialog(); + } + if ui.button("✖").clicked() { + self.reset_create_folder_dialog(); + } }); } @@ -327,6 +355,11 @@ impl FileExplorer { } } + fn reset_create_folder_dialog(&mut self) { + self.create_folder_input.clear(); + self.create_folder_dialog = false; + } + fn current_directory(&self) -> Option<&Path> { if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { return Some(x.as_path()) @@ -401,6 +434,8 @@ impl FileExplorer { fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { let paths = fs::read_dir(path)?; + self.reset_create_folder_dialog(); + self.directory_content.clear(); for path in paths { From b106dfce8f75d441e9ae3e7f92e227a964f8438d Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 23 Jan 2024 21:13:34 +0100 Subject: [PATCH 042/124] Move CreateDirectoryDialog to seperate struct --- src/lib.rs | 89 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 31 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 42651d68..fd35d536 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,8 +19,7 @@ pub struct FileExplorer { directory_offset: usize, directory_content: Vec, - create_folder_dialog: bool, - create_folder_input: String, + create_directory_dialog: CreateDirectoryDialog, selected_item: Option, search_value: String @@ -42,8 +41,7 @@ impl FileExplorer { directory_offset: 0, directory_content: vec![], - create_folder_dialog: false, - create_folder_input: String::new(), + create_directory_dialog: CreateDirectoryDialog::new(), selected_item: None, search_value: String::new(), @@ -112,9 +110,9 @@ impl FileExplorer { let _ = self.load_next_directory(); } - if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "+", !self.create_folder_dialog) { - self.create_folder_input.clear(); - self.create_folder_dialog = true; + if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "+", + !self.create_directory_dialog.is_open()) { + self.create_directory_dialog.open(); } // Current path display @@ -286,24 +284,7 @@ impl FileExplorer { self.directory_content = data; - if self.create_folder_dialog { - self.update_create_folder_dialog(ui); - } - }); - } - - fn update_create_folder_dialog(&mut self, ui: &mut egui::Ui) { - ui.horizontal(|ui| { - // TODO: Add "Create new folder" icon - ui.text_edit_singleline(&mut self.create_folder_input).scroll_to_me(None); - // TODO: Validate that the filename is unique - if ui.button("✔").clicked() { - // TODO: Create folder and append it to the end of directory_content - self.reset_create_folder_dialog(); - } - if ui.button("✖").clicked() { - self.reset_create_folder_dialog(); - } + self.create_directory_dialog.update(ui); }); } @@ -355,11 +336,6 @@ impl FileExplorer { } } - fn reset_create_folder_dialog(&mut self) { - self.create_folder_input.clear(); - self.create_folder_dialog = false; - } - fn current_directory(&self) -> Option<&Path> { if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { return Some(x.as_path()) @@ -434,7 +410,7 @@ impl FileExplorer { fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { let paths = fs::read_dir(path)?; - self.reset_create_folder_dialog(); + self.create_directory_dialog.close(); self.directory_content.clear(); @@ -452,6 +428,57 @@ impl FileExplorer { } } +struct CreateDirectoryDialog { + open: bool, + input: String +} + +impl CreateDirectoryDialog { + pub fn new() -> Self { + Self { + open: false, + input: String::new() + } + } + + pub fn open(&mut self) { + self.reset(); + self.open = true; + } + + pub fn close(&mut self) { + self.reset(); + } + + pub fn update(&mut self, ui: &mut egui::Ui) { + if !self.open { + return; + } + + ui.horizontal(|ui| { + // TODO: Add "Create new folder" icon + ui.text_edit_singleline(&mut self.input).scroll_to_me(None); + // TODO: Validate that the filename is unique + if ui.button("✔").clicked() { + // TODO: Create folder and append it to the end of directory_content + self.reset(); + } + if ui.button("✖").clicked() { + self.reset(); + } + }); + } + + pub fn is_open(&self) -> bool { + self.open + } + + fn reset(&mut self) { + self.open = false; + self.input.clear(); + } +} + fn ui_button_enabled_disabled(ui: &mut egui::Ui, size: egui::Vec2, text: &str, active: bool) -> bool { if !active { From 3cbcfa58fd36370f35e1facfc8861ce8426a6993 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 23 Jan 2024 21:20:29 +0100 Subject: [PATCH 043/124] CreateDirectoryDialog: only scroll on first frame --- src/lib.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fd35d536..44a4e11f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -430,6 +430,7 @@ impl FileExplorer { struct CreateDirectoryDialog { open: bool, + init: bool, input: String } @@ -437,6 +438,7 @@ impl CreateDirectoryDialog { pub fn new() -> Self { Self { open: false, + init: false, input: String::new() } } @@ -444,6 +446,7 @@ impl CreateDirectoryDialog { pub fn open(&mut self) { self.reset(); self.open = true; + self.init = true; } pub fn close(&mut self) { @@ -456,8 +459,17 @@ impl CreateDirectoryDialog { } ui.horizontal(|ui| { - // TODO: Add "Create new folder" icon - ui.text_edit_singleline(&mut self.input).scroll_to_me(None); + ui.label("🗀"); + + let response = ui.text_edit_singleline(&mut self.input); + + if self.init { + response.scroll_to_me(None); + response.request_focus(); + + self.init = false; + } + // TODO: Validate that the filename is unique if ui.button("✔").clicked() { // TODO: Create folder and append it to the end of directory_content @@ -475,6 +487,7 @@ impl CreateDirectoryDialog { fn reset(&mut self) { self.open = false; + self.init = false; self.input.clear(); } } From 47d603e104c3b3c15146668ad0071da6919daabf Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 23 Jan 2024 22:27:50 +0100 Subject: [PATCH 044/124] Implement input validation --- src/lib.rs | 121 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 99 insertions(+), 22 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 44a4e11f..4eb5db80 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -93,26 +93,27 @@ impl FileExplorer { // Navigation buttons if let Some(x) = self.current_directory() { - if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { + if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { let _ = self.load_parent(); } } else { - let _ = ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", false); + let _ = ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", false); } - if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏴", - self.directory_offset + 1 < self.directory_stack.len()) { + if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏴", + self.directory_offset + 1 < self.directory_stack.len()) { let _ = self.load_previous_directory(); } - if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏵", self.directory_offset != 0) { + if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏵", self.directory_offset != 0) { let _ = self.load_next_directory(); } - if ui_button_enabled_disabled(ui, NAV_BUTTON_SIZE, "+", - !self.create_directory_dialog.is_open()) { - self.create_directory_dialog.open(); + if ui_button_sized(ui, NAV_BUTTON_SIZE, "+", !self.create_directory_dialog.is_open()) { + if let Some(x) = self.current_directory() { + self.create_directory_dialog.open(x.to_path_buf()); + } } // Current path display @@ -284,7 +285,9 @@ impl FileExplorer { self.directory_content = data; - self.create_directory_dialog.update(ui); + if let Some(dir) = self.create_directory_dialog.update(ui).directory() { + self.directory_content.push(dir); + } }); } @@ -428,10 +431,35 @@ impl FileExplorer { } } +struct CreateDirectoryResponse { + directory: Option +} + +impl CreateDirectoryResponse { + pub fn new(directory: PathBuf) -> Self { + Self { + directory: Some(directory) + } + } + + pub fn new_empty() -> Self { + Self { + directory: None + } + } + + pub fn directory(&self) -> Option { + self.directory.clone() + } +} + struct CreateDirectoryDialog { open: bool, init: bool, - input: String + directory: Option, + + input: String, + error: Option } impl CreateDirectoryDialog { @@ -439,23 +467,28 @@ impl CreateDirectoryDialog { Self { open: false, init: false, - input: String::new() + directory: None, + + input: String::new(), + error: None } } - pub fn open(&mut self) { + pub fn open(&mut self, directory: PathBuf) { self.reset(); + self.open = true; self.init = true; + self.directory = Some(directory); } pub fn close(&mut self) { self.reset(); } - pub fn update(&mut self, ui: &mut egui::Ui) { + pub fn update(&mut self, ui: &mut egui::Ui) -> CreateDirectoryResponse { if !self.open { - return; + return CreateDirectoryResponse::new_empty(); } ui.horizontal(|ui| { @@ -467,34 +500,78 @@ impl CreateDirectoryDialog { response.scroll_to_me(None); response.request_focus(); + self.error = self.validate_input(); self.init = false; } - // TODO: Validate that the filename is unique - if ui.button("✔").clicked() { - // TODO: Create folder and append it to the end of directory_content - self.reset(); + if response.changed() { + self.error = self.validate_input(); + } + + if ui_button(ui, "✔", self.error.is_none()) { + self.close() } + if ui.button("✖").clicked() { - self.reset(); + self.close(); + } + + if let Some(err) = &self.error { + ui.label(err); } }); + + CreateDirectoryResponse::new_empty() } pub fn is_open(&self) -> bool { self.open } + fn validate_input(&mut self) -> Option { + if self.input.is_empty() { + return Some("Name of the folder can not be empty".to_string()); + } + + let dir = self.directory.clone(); + if let Some(mut x) = dir { + x.push(self.input.as_str()); + + if x.is_dir() { + return Some("A directory with the name already exists".to_string()) + } + } + else { + // This error should not occur because the validate_input function is only + // called when the dialog is open and the directory is set. + // If this error occurs, there is most likely a bug in the code. + return Some("No directory given".to_string()) + } + + None + } + fn reset(&mut self) { self.open = false; self.init = false; + self.directory = None; self.input.clear(); } } -fn ui_button_enabled_disabled(ui: &mut egui::Ui, size: egui::Vec2, text: &str, - active: bool) -> bool { - if !active { +fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { + if !enabled { + let c = ui.style().visuals.widgets.noninteractive.bg_fill; + let bg_color = egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100); + let _ = ui.add(egui::Button::new(text).fill(bg_color)); + return false; + } + + ui.add(egui::Button::new(text)).clicked() +} + +fn ui_button_sized(ui: &mut egui::Ui, size: egui::Vec2, text: &str, enabled: bool) -> bool { + if !enabled { let c = ui.style().visuals.widgets.noninteractive.bg_fill; let bg_color = egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100); let _ = ui.add_sized(size, egui::Button::new(text).fill(bg_color)); From b7573039efc45e9b11d56cd2fbecb3a6d67c539e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 23 Jan 2024 22:30:14 +0100 Subject: [PATCH 045/124] Cleanup name validation --- src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4eb5db80..3f2c66fc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -533,8 +533,7 @@ impl CreateDirectoryDialog { return Some("Name of the folder can not be empty".to_string()); } - let dir = self.directory.clone(); - if let Some(mut x) = dir { + if let Some(mut x) = self.directory.clone() { x.push(self.input.as_str()); if x.is_dir() { From bbf931eeff125946f97524d4a7ccd9716f55d667 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 23 Jan 2024 22:49:32 +0100 Subject: [PATCH 046/124] Add function to create directory --- src/lib.rs | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3f2c66fc..70a7cf29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -436,9 +436,9 @@ struct CreateDirectoryResponse { } impl CreateDirectoryResponse { - pub fn new(directory: PathBuf) -> Self { + pub fn new(directory: &Path) -> Self { Self { - directory: Some(directory) + directory: Some(directory.to_path_buf()) } } @@ -487,10 +487,13 @@ impl CreateDirectoryDialog { } pub fn update(&mut self, ui: &mut egui::Ui) -> CreateDirectoryResponse { + if !self.open { return CreateDirectoryResponse::new_empty(); } + let mut result = CreateDirectoryResponse::new_empty(); + ui.horizontal(|ui| { ui.label("🗀"); @@ -509,7 +512,7 @@ impl CreateDirectoryDialog { } if ui_button(ui, "✔", self.error.is_none()) { - self.close() + result = self.create_directory(); } if ui.button("✖").clicked() { @@ -521,13 +524,37 @@ impl CreateDirectoryDialog { } }); - CreateDirectoryResponse::new_empty() + result } pub fn is_open(&self) -> bool { self.open } + fn create_directory(&mut self) -> CreateDirectoryResponse { + if let Some(mut dir) = self.directory.clone() { + dir.push(self.input.as_str()); + + match fs::create_dir(&dir) { + Ok(()) => { + self.close(); + return CreateDirectoryResponse::new(dir.as_path()); + } + Err(err) => { + self.error = Some(format!("Error: {}", err.to_string())); + return CreateDirectoryResponse::new_empty(); + } + } + } + + // This error should not occur because the create_directory function is only + // called when the dialog is open and the directory is set. + // If this error occurs, there is most likely a bug in the code. + self.error = Some("No directory given".to_string()); + + CreateDirectoryResponse::new_empty() + } + fn validate_input(&mut self) -> Option { if self.input.is_empty() { return Some("Name of the folder can not be empty".to_string()); From 3b4e35a968f32707bed7947146c169db4f6473a2 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 23 Jan 2024 22:51:01 +0100 Subject: [PATCH 047/124] Fix linter error --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 70a7cf29..461cddfb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -541,7 +541,7 @@ impl CreateDirectoryDialog { return CreateDirectoryResponse::new(dir.as_path()); } Err(err) => { - self.error = Some(format!("Error: {}", err.to_string())); + self.error = Some(format!("Error: {}", err)); return CreateDirectoryResponse::new_empty(); } } From 36f4b9d206403d6eba240de584f403724bd6d9c7 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 20:08:44 +0100 Subject: [PATCH 048/124] Remove stroke from disabled buttons --- src/lib.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 461cddfb..e274125d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -585,11 +585,20 @@ impl CreateDirectoryDialog { } } +#[inline] +fn get_disabled_fill_color(ui: &egui::Ui) -> egui::Color32 { + let c = ui.style().visuals.widgets.noninteractive.bg_fill; + egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100) +} + fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { if !enabled { - let c = ui.style().visuals.widgets.noninteractive.bg_fill; - let bg_color = egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100); - let _ = ui.add(egui::Button::new(text).fill(bg_color)); + let button = egui::Button::new(text) + .stroke(egui::Stroke::NONE) + .fill(get_disabled_fill_color(ui)); + + let _ = ui.add(button); + return false; } @@ -598,9 +607,12 @@ fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { fn ui_button_sized(ui: &mut egui::Ui, size: egui::Vec2, text: &str, enabled: bool) -> bool { if !enabled { - let c = ui.style().visuals.widgets.noninteractive.bg_fill; - let bg_color = egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100); - let _ = ui.add_sized(size, egui::Button::new(text).fill(bg_color)); + let button = egui::Button::new(text) + .stroke(egui::Stroke::NONE) + .fill(get_disabled_fill_color(ui)); + + let _ = ui.add_sized(size, button); + return false; } From 4f226d8f55bdd10dd52b09475e8b1c777d5a9756 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 20:22:41 +0100 Subject: [PATCH 049/124] Select created directory --- src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index e274125d..20c66bf6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -286,7 +286,8 @@ impl FileExplorer { self.directory_content = data; if let Some(dir) = self.create_directory_dialog.update(ui).directory() { - self.directory_content.push(dir); + self.directory_content.push(dir.clone()); + self.selected_item = Some(dir); } }); } From f897baf9c14ac4ce722e5845210374fba8f6fe8f Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 20:28:49 +0100 Subject: [PATCH 050/124] Add top_down_justified layout for left and central panel --- src/lib.rs | 136 +++++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 20c66bf6..149d40b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -179,28 +179,30 @@ impl FileExplorer { } fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - self.update_user_directories(ui); + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { + self.update_user_directories(ui); - ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); + ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - ui.label("Devices"); + ui.label("Devices"); - let disks = std::mem::take(&mut self.system_disks); + let disks = std::mem::take(&mut self.system_disks); - for disk in &disks { - // TODO: Get display name of the devices. - // Currently on linux "/dev/sda1" is returned. - let name = match disk.name().to_str() { - Some(x) => x, - None => continue - }; + for disk in &disks { + // TODO: Get display name of the devices. + // Currently on linux "/dev/sda1" is returned. + let name = match disk.name().to_str() { + Some(x) => x, + None => continue + }; - if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { - let _ = self.load_directory(disk.mount_point()); + if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { + let _ = self.load_directory(disk.mount_point()); + } } - } - self.system_disks = disks; + self.system_disks = disks; + }); } fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { @@ -228,67 +230,69 @@ impl FileExplorer { } fn update_central_panel(&mut self, ui: &mut egui::Ui) { - egui::containers::ScrollArea::vertical() - .auto_shrink([false, false]) - .show(ui, |ui| { - // Temporarily take ownership of the directory contents to be able to - // update it in the for loop using load_directory. - // Otherwise we would get an error that `*self` cannot be borrowed as mutable - // more than once at a time. - // Make sure to return the function after updating the directory_content, - // otherwise the change will be overwritten with the last statement of the function. - let data = std::mem::take(&mut self.directory_content); - - for path in data.iter() { - // Is there a way to write this better? - let file_name = match path.file_name() { - Some(x) => { - match x.to_str() { - Some(v) => v, - _ => continue - } - }, - _ => continue - }; + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { + egui::containers::ScrollArea::vertical() + .auto_shrink([false, false]) + .show(ui, |ui| { + // Temporarily take ownership of the directory contents to be able to + // update it in the for loop using load_directory. + // Otherwise we would get an error that `*self` cannot be borrowed as mutable + // more than once at a time. + // Make sure to return the function after updating the directory_content, + // otherwise the change will be overwritten with the last statement of the function. + let data = std::mem::take(&mut self.directory_content); + + for path in data.iter() { + // Is there a way to write this better? + let file_name = match path.file_name() { + Some(x) => { + match x.to_str() { + Some(v) => v, + _ => continue + } + }, + _ => continue + }; + + if !self.search_value.is_empty() && + !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { + continue; + } - if !self.search_value.is_empty() && - !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { - continue; - } + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹" + }; - let icon = match path.is_dir() { - true => "🗀", - _ => "🖹" - }; + let mut selected = false; + if let Some(x) = &self.selected_item { + selected = x == path; + } - let mut selected = false; - if let Some(x) = &self.selected_item { - selected = x == path; - } + let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); - let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); + if response.clicked() { + self.selected_item = Some(path.clone()); + } - if response.clicked() { - self.selected_item = Some(path.clone()); - } + if response.double_clicked() { + if path.is_dir() { + let _ = self.load_directory(path); + return; + } - if response.double_clicked() { - if path.is_dir() { - let _ = self.load_directory(path); - return; + self.selected_item = Some(path.clone()); + // TODO: Close file explorer } - - self.selected_item = Some(path.clone()); - // TODO: Close file explorer } - } - self.directory_content = data; + self.directory_content = data; - if let Some(dir) = self.create_directory_dialog.update(ui).directory() { - self.directory_content.push(dir.clone()); - self.selected_item = Some(dir); - } + if let Some(dir) = self.create_directory_dialog.update(ui).directory() { + self.directory_content.push(dir.clone()); + self.selected_item = Some(dir); + } + }); }); } From 370efdf60ac7ddcebc060044902d830b6757b975 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 20:36:45 +0100 Subject: [PATCH 051/124] Scroll to selection --- src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 149d40b0..86b57968 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ pub struct FileExplorer { create_directory_dialog: CreateDirectoryDialog, selected_item: Option, + scroll_to_selection: bool, search_value: String } @@ -44,6 +45,7 @@ impl FileExplorer { create_directory_dialog: CreateDirectoryDialog::new(), selected_item: None, + scroll_to_selection: false, search_value: String::new(), } } @@ -271,6 +273,11 @@ impl FileExplorer { let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); + if selected && self.scroll_to_selection { + response.scroll_to_me(None); + self.scroll_to_selection = false; + } + if response.clicked() { self.selected_item = Some(path.clone()); } @@ -419,8 +426,8 @@ impl FileExplorer { let paths = fs::read_dir(path)?; self.create_directory_dialog.close(); - self.directory_content.clear(); + self.scroll_to_selection = true; for path in paths { match path { From 439a2215f7dd41e3f3119cf622d391dce0f97f3d Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 20:58:40 +0100 Subject: [PATCH 052/124] Rename project Renamed project from egui-file-explorer to egui-file-dialog --- Cargo.toml | 2 +- examples/sandbox/Cargo.toml | 2 +- examples/sandbox/src/main.rs | 6 +++--- src/lib.rs | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 28af2e55..bbb48e3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = [ ] [package] -name = "egui-file-explorer" +name = "egui-file-dialog" version = "0.1.0" edition = "2021" diff --git a/examples/sandbox/Cargo.toml b/examples/sandbox/Cargo.toml index 979ee90b..9764912e 100644 --- a/examples/sandbox/Cargo.toml +++ b/examples/sandbox/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] eframe = { version = "0.25.0", default-features = false, features = ["glow"] } -egui-file-explorer = { version = "0.1.0", path = "../../"} +egui-file-dialog = { version = "0.1.0", path = "../../"} diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index 2b68619a..6d5f17e0 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -1,14 +1,14 @@ use eframe::egui; -use egui_file_explorer::FileExplorer; +use egui_file_dialog::FileDialog; struct MyApp { - file_explorer: FileExplorer + file_explorer: FileDialog } impl MyApp { pub fn new(_cc: &eframe::CreationContext) -> Self { let mut obj = Self { - file_explorer: FileExplorer::new() + file_explorer: FileDialog::new() }; obj.file_explorer.open(); obj diff --git a/src/lib.rs b/src/lib.rs index 86b57968..dbf39ba7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,13 +5,13 @@ use directories::UserDirs; use sysinfo::Disks; // NOTE: Currently not implemented, just an idea! -pub enum FileExplorerMode { +pub enum FileDialogMode { OpenFile, OpenDirectory, SaveFile } -pub struct FileExplorer { +pub struct FileDialog { user_directories: Option, system_disks: Disks, @@ -26,15 +26,15 @@ pub struct FileExplorer { search_value: String } -impl Default for FileExplorer { +impl Default for FileDialog { fn default() -> Self { Self::new() } } -impl FileExplorer { +impl FileDialog { pub fn new() -> Self { - FileExplorer { + FileDialog { user_directories: UserDirs::new(), system_disks: Disks::new_with_refreshed_list(), @@ -58,7 +58,7 @@ impl FileExplorer { pub fn update(&mut self, ctx: &egui::Context) { // TODO: Make window title and options configurable - egui::Window::new("File explorer") + egui::Window::new("File dialog") .default_size([800.0, 500.0]) .show(ctx, |ui| { egui::TopBottomPanel::top("fe_top_panel") From d6bb8aab3dd876a661940309bbc78954293fbcc9 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 21:00:44 +0100 Subject: [PATCH 053/124] Move device list to seperate function --- src/lib.rs | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index dbf39ba7..7667d78d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -186,24 +186,7 @@ impl FileDialog { ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - ui.label("Devices"); - - let disks = std::mem::take(&mut self.system_disks); - - for disk in &disks { - // TODO: Get display name of the devices. - // Currently on linux "/dev/sda1" is returned. - let name = match disk.name().to_str() { - Some(x) => x, - None => continue - }; - - if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { - let _ = self.load_directory(disk.mount_point()); - } - } - - self.system_disks = disks; + self.update_devices(ui); }); } @@ -351,6 +334,27 @@ impl FileDialog { } } + fn update_devices(&mut self, ui: &mut egui::Ui) { + ui.label("Devices"); + + let disks = std::mem::take(&mut self.system_disks); + + for disk in &disks { + // TODO: Get display name of the devices. + // Currently on linux "/dev/sda1" is returned. + let name = match disk.name().to_str() { + Some(x) => x, + None => continue + }; + + if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { + let _ = self.load_directory(disk.mount_point()); + } + } + + self.system_disks = disks; + } + fn current_directory(&self) -> Option<&Path> { if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { return Some(x.as_path()) From 3be82516de8ce329661090a8da745d22625cc270 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 23:32:12 +0100 Subject: [PATCH 054/124] Implement public FileDialog API --- examples/sandbox/src/main.rs | 55 ++++++-- src/lib.rs | 260 ++++++++++++++++++++++++++++++----- 2 files changed, 276 insertions(+), 39 deletions(-) diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index 6d5f17e0..afef80cb 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -1,17 +1,26 @@ + +use std::path::PathBuf; + use eframe::egui; -use egui_file_dialog::FileDialog; +use egui_file_dialog::{FileDialog, DialogState, DialogMode}; struct MyApp { - file_explorer: FileDialog + file_explorer: FileDialog, + + selected_directory: Option, + selected_file: Option, + saved_file: Option } impl MyApp { pub fn new(_cc: &eframe::CreationContext) -> Self { - let mut obj = Self { - file_explorer: FileDialog::new() - }; - obj.file_explorer.open(); - obj + Self { + file_explorer: FileDialog::new(), + + selected_directory: None, + selected_file: None, + saved_file: None + } } } @@ -21,7 +30,37 @@ impl eframe::App for MyApp { ui.heading("My egui application"); egui::widgets::global_dark_light_mode_buttons(ui); - self.file_explorer.update(ctx); + ui.add_space(5.0); + + if ui.button("Select directory").clicked() { + self.file_explorer.select_directory(); + } + ui.label(format!("Selected directory: {:?}", self.selected_directory)); + + ui.add_space(5.0); + + if ui.button("Select file").clicked() { + self.file_explorer.select_file(); + } + ui.label(format!("Selected file: {:?}", self.selected_file)); + + ui.add_space(5.0); + + if ui.button("Save file").clicked() { + self.file_explorer.save_file(); + } + ui.label(format!("File to save: {:?}", self.saved_file)); + + match self.file_explorer.update(ctx).state() { + DialogState::Selected(path) => { + match self.file_explorer.mode() { + DialogMode::SelectDirectory => self.selected_directory = Some(path), + DialogMode::SelectFile => self.selected_file = Some(path), + DialogMode::SaveFile => self.saved_file = Some(path) + } + } + _ => {} + }; }); } } diff --git a/src/lib.rs b/src/lib.rs index 7667d78d..3a56fb5b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,14 +4,26 @@ use std::path::{Path, PathBuf}; use directories::UserDirs; use sysinfo::Disks; -// NOTE: Currently not implemented, just an idea! -pub enum FileDialogMode { - OpenFile, - OpenDirectory, +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum DialogMode { + SelectFile, + SelectDirectory, SaveFile } +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum DialogState { + Open, + Closed, + Selected(PathBuf), + Cancelled +} + pub struct FileDialog { + mode: DialogMode, + state: DialogState, + initial_directory: PathBuf, + user_directories: Option, system_disks: Disks, @@ -22,6 +34,9 @@ pub struct FileDialog { create_directory_dialog: CreateDirectoryDialog, selected_item: Option, + file_name_input: String, // Only used when mode = DialogMode::SaveFile + file_name_input_error: Option, + scroll_to_selection: bool, search_value: String } @@ -35,6 +50,10 @@ impl Default for FileDialog { impl FileDialog { pub fn new() -> Self { FileDialog { + mode: DialogMode::SelectDirectory, + state: DialogState::Closed, + initial_directory: std::env::current_dir().unwrap_or_default(), + user_directories: UserDirs::new(), system_disks: Disks::new_with_refreshed_list(), @@ -45,21 +64,60 @@ impl FileDialog { create_directory_dialog: CreateDirectoryDialog::new(), selected_item: None, + file_name_input: String::new(), + file_name_input_error: None, + scroll_to_selection: false, - search_value: String::new(), + search_value: String::new() } } - // TODO: Enable option to set initial directory - pub fn open(&mut self) { + pub fn initial_directory(mut self, directory: PathBuf) -> Self { + self.initial_directory = directory.clone(); + self + } + + pub fn open(&mut self, mode: DialogMode) { + self.reset(); + + self.mode = mode; + self.state = DialogState::Open; + // TODO: Error handling - let _ = self.load_directory(Path::new("./")); + let _ = self.load_directory(&self.initial_directory.clone()); } - pub fn update(&mut self, ctx: &egui::Context) { - // TODO: Make window title and options configurable + pub fn select_directory(&mut self) { + self.open(DialogMode::SelectDirectory); + } + + pub fn select_file(&mut self) { + self.open(DialogMode::SelectFile); + } + + pub fn save_file(&mut self) { + self.open(DialogMode::SaveFile); + } + + pub fn mode(&self) -> DialogMode { + self.mode + } + + pub fn state(&self) -> DialogState { + self.state.clone() + } + + pub fn update(&mut self, ctx: &egui::Context) -> &Self { + if self.state != DialogState::Open { + return self; + } + + let mut is_open = true; + egui::Window::new("File dialog") + .open(&mut is_open) .default_size([800.0, 500.0]) + .collapsible(false) .show(ctx, |ui| { egui::TopBottomPanel::top("fe_top_panel") .resizable(false) @@ -85,6 +143,13 @@ impl FileDialog { self.update_central_panel(ui); }); }); + + // User closed the window without finishing the dialog + if !is_open { + self.cancel(); + } + + self } fn update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { @@ -195,22 +260,76 @@ impl FileDialog { ui.add_space(5.0); - ui.horizontal(|ui|{ - ui.label("Selected item:"); + ui.horizontal(|ui| { + match &self.mode { + DialogMode::SelectDirectory => ui.label("Selected directory:"), + DialogMode::SelectFile => ui.label("Selected file:"), + DialogMode::SaveFile => ui.label("File name:") + }; + + match &self.mode { + DialogMode::SelectDirectory | DialogMode::SelectFile => { + if self.is_selection_valid() { + if let Some(x) = &self.selected_item { + if let Some(name) = self.get_file_name(x) { + ui.colored_label(ui.style().visuals.selection.bg_fill, name); + } + } + } + }, + DialogMode::SaveFile => { + let response = ui.add(egui::TextEdit::singleline(&mut self.file_name_input)); + + if response.changed() { + self.file_name_input_error = self.validate_file_name_input(); + } - if let Some(x) = &self.selected_item { - if let Some(x) = x.file_name() { - if let Some(x) = x.to_str() { - ui.colored_label(ui.style().visuals.selection.bg_fill, x); + if let Some(x) = &self.file_name_input_error { + // TODO: Use error icon instead + ui.label(x); } } - } + }; }); ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { - let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Open")); + let label = match &self.mode { + DialogMode::SelectDirectory | DialogMode::SelectFile => "Open", + DialogMode::SaveFile => "Save" + }; + + if ui_button_sized(ui, BUTTON_SIZE, label, self.is_selection_valid()) { + match &self.mode { + DialogMode::SelectDirectory | DialogMode::SelectFile => { + // self.selected_item should always contain a value, + // since self.is_selection_valid() validates the selection and + // returns false if the selection is none. + if let Some(selection) = self.selected_item.clone() { + self.finish(selection); + } + }, + DialogMode::SaveFile => { + // self.current_directory should always contain a value, + // since self.is_selection_valid() makes sure there is no + // file_name_input_error. The file_name_input_error + // gets validated every time something changes + // by the validate_file_name_input, which sets an error + // if we are currently not in a directory. + if let Some(path) = self.current_directory() { + let mut full_path = path.to_path_buf(); + full_path.push(&self.file_name_input); + + self.finish(full_path); + } + } + } + } + ui.add_space(ctx.style().spacing.item_spacing.y); - let _ = ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")); + + if ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")).clicked() { + self.cancel(); + } }); } @@ -228,19 +347,10 @@ impl FileDialog { let data = std::mem::take(&mut self.directory_content); for path in data.iter() { - // Is there a way to write this better? - let file_name = match path.file_name() { - Some(x) => { - match x.to_str() { - Some(v) => v, - _ => continue - } - }, - _ => continue - }; + let Some(file_name) = self.get_file_name(path) else { continue; }; if !self.search_value.is_empty() && - !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { + !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { continue; } @@ -272,7 +382,15 @@ impl FileDialog { } self.selected_item = Some(path.clone()); - // TODO: Close file explorer + + if self.is_selection_valid() { + // self.selected_item should always contain a value + // since self.is_selection_valid() validates the selection + // and returns false if the selection is none. + if let Some(selection) = self.selected_item.clone() { + self.finish(selection); + } + } } } @@ -355,6 +473,32 @@ impl FileDialog { self.system_disks = disks; } + fn reset(&mut self) { + self.state = DialogState::Closed; + + self.user_directories = UserDirs::new(); + self.system_disks = Disks::new_with_refreshed_list(); + + self.directory_stack = vec![]; + self.directory_offset = 0; + self.directory_content = vec![]; + + self.create_directory_dialog = CreateDirectoryDialog::new(); + + self.selected_item = None; + self.file_name_input = String::new(); + self.scroll_to_selection = false; + self.search_value = String::new(); + } + + fn finish(&mut self, selected_item: PathBuf) { + self.state = DialogState::Selected(selected_item); + } + + fn cancel(&mut self) { + self.state = DialogState::Cancelled; + } + fn current_directory(&self) -> Option<&Path> { if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { return Some(x.as_path()) @@ -363,6 +507,55 @@ impl FileDialog { None } + fn get_file_name(&self, file: &Path) -> Option { + if let Some(x) = file.file_name() { + if let Some(x) = x.to_str() { + return Some(x.to_string()); + } + } + + None + } + + fn is_selection_valid(&self) -> bool { + if let Some(selection) = &self.selected_item { + let file_name = self.get_file_name(selection); + + return match &self.mode { + DialogMode::SelectDirectory => selection.is_dir() && file_name.is_some(), + DialogMode::SelectFile => selection.is_file() && file_name.is_some(), + DialogMode::SaveFile => self.file_name_input_error.is_none() + }; + } + + if self.mode == DialogMode::SaveFile && self.file_name_input_error.is_none() { + return true; + } + + false + } + + fn validate_file_name_input(&self) -> Option { + if self.file_name_input.is_empty() { + return Some("The file name cannot be empty".to_string()); + } + + if let Some(x) = self.current_directory() { + let mut full_path = x.to_path_buf(); + full_path.push(self.file_name_input.as_str()); + + if full_path.exists() && full_path.is_file() { + return Some("A file with this name already exists".to_string()); + } + } + else { + // There is most likely a bug in the code if we get this error message! + return Some("Currently not in a directory".to_string()) + } + + None + } + fn load_next_directory(&mut self) -> io::Result<()> { if self.directory_offset == 0 { // There is no next directory that can be loaded @@ -443,6 +636,10 @@ impl FileDialog { // TODO: Sort content to display folders first // TODO: Implement "Show hidden files and folders" option + if self.mode == DialogMode::SaveFile { + self.file_name_input_error = self.validate_file_name_input(); + } + Ok(()) } } @@ -536,6 +733,7 @@ impl CreateDirectoryDialog { } if let Some(err) = &self.error { + // TODO: Use error icon instead ui.label(err); } }); From f574fd2a89ab363f3dbd3d35898459467e719e3f Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 23:35:21 +0100 Subject: [PATCH 055/124] Add refresh method --- src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 3a56fb5b..9c03bf2c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -224,7 +224,7 @@ impl FileDialog { // Reload button if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")).clicked() { - let _ = self.reload_directory(); + self.refresh(); } // Search bar @@ -491,6 +491,13 @@ impl FileDialog { self.search_value = String::new(); } + fn refresh(&mut self) { + self.user_directories = UserDirs::new(); + self.system_disks = Disks::new_with_refreshed_list(); + + let _ = self.reload_directory(); + } + fn finish(&mut self, selected_item: PathBuf) { self.state = DialogState::Selected(selected_item); } From 304cedaa6e7d6755dd00dc53fcba9b4ac8dd333e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 23:37:41 +0100 Subject: [PATCH 056/124] Rename UI functions --- src/lib.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9c03bf2c..f358bc1e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -122,7 +122,7 @@ impl FileDialog { egui::TopBottomPanel::top("fe_top_panel") .resizable(false) .show_inside(ui, |ui| { - self.update_top_panel(ctx, ui); + self.ui_update_top_panel(ctx, ui); }); egui::SidePanel::left("fe_left_panel") @@ -140,7 +140,7 @@ impl FileDialog { }); egui::CentralPanel::default().show_inside(ui, |ui| { - self.update_central_panel(ui); + self.ui_update_central_panel(ui); }); }); @@ -152,7 +152,7 @@ impl FileDialog { self } - fn update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + fn ui_update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); const SEARCH_INPUT_WIDTH: f32 = 120.0; @@ -247,11 +247,11 @@ impl FileDialog { fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { - self.update_user_directories(ui); + self.ui_update_user_directories(ui); ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - self.update_devices(ui); + self.ui_update_devices(ui); }); } @@ -333,7 +333,7 @@ impl FileDialog { }); } - fn update_central_panel(&mut self, ui: &mut egui::Ui) { + fn ui_update_central_panel(&mut self, ui: &mut egui::Ui) { ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { egui::containers::ScrollArea::vertical() .auto_shrink([false, false]) @@ -404,7 +404,7 @@ impl FileDialog { }); } - fn update_user_directories(&mut self, ui: &mut egui::Ui) { + fn ui_update_user_directories(&mut self, ui: &mut egui::Ui) { if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); @@ -452,7 +452,7 @@ impl FileDialog { } } - fn update_devices(&mut self, ui: &mut egui::Ui) { + fn ui_update_devices(&mut self, ui: &mut egui::Ui) { ui.label("Devices"); let disks = std::mem::take(&mut self.system_disks); From 896b9822ddece5e22c9e0493285140a12950bd34 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 25 Jan 2024 23:44:05 +0100 Subject: [PATCH 057/124] Use selection in SaveFile mode --- src/lib.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f358bc1e..dc130e33 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -372,7 +372,7 @@ impl FileDialog { } if response.clicked() { - self.selected_item = Some(path.clone()); + self.select_item(path.as_path()); } if response.double_clicked() { @@ -381,7 +381,7 @@ impl FileDialog { return; } - self.selected_item = Some(path.clone()); + self.select_item(path.as_path()); if self.is_selection_valid() { // self.selected_item should always contain a value @@ -398,7 +398,7 @@ impl FileDialog { if let Some(dir) = self.create_directory_dialog.update(ui).directory() { self.directory_content.push(dir.clone()); - self.selected_item = Some(dir); + self.select_item(dir.as_path()); } }); }); @@ -563,6 +563,17 @@ impl FileDialog { None } + fn select_item(&mut self, path: &Path) { + self.selected_item = Some(path.to_path_buf()); + + if self.mode == DialogMode::SaveFile && path.is_file() { + if let Some(file_name) = self.get_file_name(path) { + self.file_name_input = file_name; + self.file_name_input_error = self.validate_file_name_input(); + } + } + } + fn load_next_directory(&mut self) -> io::Result<()> { if self.directory_offset == 0 { // There is no next directory that can be loaded From c7e743f28c1c731f022e809d356d788eb4f10b06 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 20:30:59 +0100 Subject: [PATCH 058/124] Restructure code --- src/file_dialog/create_directory_dialog.rs | 159 ++++ src/file_dialog/mod.rs | 668 ++++++++++++++++ src/lib.rs | 853 +-------------------- src/ui.rs | 34 + 4 files changed, 864 insertions(+), 850 deletions(-) create mode 100644 src/file_dialog/create_directory_dialog.rs create mode 100644 src/file_dialog/mod.rs create mode 100644 src/ui.rs diff --git a/src/file_dialog/create_directory_dialog.rs b/src/file_dialog/create_directory_dialog.rs new file mode 100644 index 00000000..b83820d8 --- /dev/null +++ b/src/file_dialog/create_directory_dialog.rs @@ -0,0 +1,159 @@ +use std::path::{PathBuf, Path}; +use std::fs; + +use crate::ui::ui_button; + +pub struct CreateDirectoryResponse { + directory: Option +} + +impl CreateDirectoryResponse { + pub fn new(directory: &Path) -> Self { + Self { + directory: Some(directory.to_path_buf()) + } + } + + pub fn new_empty() -> Self { + Self { + directory: None + } + } + + pub fn directory(&self) -> Option { + self.directory.clone() + } +} + +pub struct CreateDirectoryDialog { + open: bool, + init: bool, + directory: Option, + + input: String, + error: Option +} + +impl CreateDirectoryDialog { + pub fn new() -> Self { + Self { + open: false, + init: false, + directory: None, + + input: String::new(), + error: None + } + } + + pub fn open(&mut self, directory: PathBuf) { + self.reset(); + + self.open = true; + self.init = true; + self.directory = Some(directory); + } + + pub fn close(&mut self) { + self.reset(); + } + + pub fn update(&mut self, ui: &mut egui::Ui) -> CreateDirectoryResponse { + + if !self.open { + return CreateDirectoryResponse::new_empty(); + } + + let mut result = CreateDirectoryResponse::new_empty(); + + ui.horizontal(|ui| { + ui.label("🗀"); + + let response = ui.text_edit_singleline(&mut self.input); + + if self.init { + response.scroll_to_me(None); + response.request_focus(); + + self.error = self.validate_input(); + self.init = false; + } + + if response.changed() { + self.error = self.validate_input(); + } + + if ui_button(ui, "✔", self.error.is_none()) { + result = self.create_directory(); + } + + if ui.button("✖").clicked() { + self.close(); + } + + if let Some(err) = &self.error { + // TODO: Use error icon instead + ui.label(err); + } + }); + + result + } + + pub fn is_open(&self) -> bool { + self.open + } + + fn create_directory(&mut self) -> CreateDirectoryResponse { + if let Some(mut dir) = self.directory.clone() { + dir.push(self.input.as_str()); + + match fs::create_dir(&dir) { + Ok(()) => { + self.close(); + return CreateDirectoryResponse::new(dir.as_path()); + } + Err(err) => { + self.error = Some(format!("Error: {}", err)); + return CreateDirectoryResponse::new_empty(); + } + } + } + + // This error should not occur because the create_directory function is only + // called when the dialog is open and the directory is set. + // If this error occurs, there is most likely a bug in the code. + self.error = Some("No directory given".to_string()); + + CreateDirectoryResponse::new_empty() + } + + fn validate_input(&mut self) -> Option { + if self.input.is_empty() { + return Some("Name of the folder can not be empty".to_string()); + } + + if let Some(mut x) = self.directory.clone() { + x.push(self.input.as_str()); + + if x.is_dir() { + return Some("A directory with the name already exists".to_string()) + } + } + else { + // This error should not occur because the validate_input function is only + // called when the dialog is open and the directory is set. + // If this error occurs, there is most likely a bug in the code. + return Some("No directory given".to_string()) + } + + None + } + + fn reset(&mut self) { + self.open = false; + self.init = false; + self.directory = None; + self.input.clear(); + } +} diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs new file mode 100644 index 00000000..8740a992 --- /dev/null +++ b/src/file_dialog/mod.rs @@ -0,0 +1,668 @@ +use std::{fs, io}; +use std::path::{Path, PathBuf}; + +use directories::UserDirs; +use sysinfo::Disks; + +mod create_directory_dialog; +use create_directory_dialog::CreateDirectoryDialog; + +use crate::ui::ui_button_sized; + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum DialogMode { + SelectFile, + SelectDirectory, + SaveFile +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum DialogState { + Open, + Closed, + Selected(PathBuf), + Cancelled +} + +pub struct FileDialog { + mode: DialogMode, + state: DialogState, + initial_directory: PathBuf, + + user_directories: Option, + system_disks: Disks, + + directory_stack: Vec, + directory_offset: usize, + directory_content: Vec, + + create_directory_dialog: CreateDirectoryDialog, + + selected_item: Option, + file_name_input: String, // Only used when mode = DialogMode::SaveFile + file_name_input_error: Option, + + scroll_to_selection: bool, + search_value: String +} + +impl Default for FileDialog { + fn default() -> Self { + Self::new() + } +} + +impl FileDialog { + pub fn new() -> Self { + FileDialog { + mode: DialogMode::SelectDirectory, + state: DialogState::Closed, + initial_directory: std::env::current_dir().unwrap_or_default(), + + user_directories: UserDirs::new(), + system_disks: Disks::new_with_refreshed_list(), + + directory_stack: vec![], + directory_offset: 0, + directory_content: vec![], + + create_directory_dialog: CreateDirectoryDialog::new(), + + selected_item: None, + file_name_input: String::new(), + file_name_input_error: None, + + scroll_to_selection: false, + search_value: String::new() + } + } + + pub fn initial_directory(mut self, directory: PathBuf) -> Self { + self.initial_directory = directory.clone(); + self + } + + pub fn open(&mut self, mode: DialogMode) { + self.reset(); + + self.mode = mode; + self.state = DialogState::Open; + + // TODO: Error handling + let _ = self.load_directory(&self.initial_directory.clone()); + } + + pub fn select_directory(&mut self) { + self.open(DialogMode::SelectDirectory); + } + + pub fn select_file(&mut self) { + self.open(DialogMode::SelectFile); + } + + pub fn save_file(&mut self) { + self.open(DialogMode::SaveFile); + } + + pub fn mode(&self) -> DialogMode { + self.mode + } + + pub fn state(&self) -> DialogState { + self.state.clone() + } + + pub fn update(&mut self, ctx: &egui::Context) -> &Self { + if self.state != DialogState::Open { + return self; + } + + let mut is_open = true; + + egui::Window::new("File dialog") + .open(&mut is_open) + .default_size([800.0, 500.0]) + .collapsible(false) + .show(ctx, |ui| { + egui::TopBottomPanel::top("fe_top_panel") + .resizable(false) + .show_inside(ui, |ui| { + self.ui_update_top_panel(ctx, ui); + }); + + egui::SidePanel::left("fe_left_panel") + .resizable(true) + .default_width(150.0) + .width_range(100.0..=400.0) + .show_inside(ui, |ui| { + self.update_left_panel(ctx, ui); + }); + + egui::TopBottomPanel::bottom("fe_bottom_panel") + .resizable(false) + .show_inside(ui, |ui| { + self.update_bottom_panel(ctx, ui); + }); + + egui::CentralPanel::default().show_inside(ui, |ui| { + self.ui_update_central_panel(ui); + }); + }); + + // User closed the window without finishing the dialog + if !is_open { + self.cancel(); + } + + self + } + + fn ui_update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); + const SEARCH_INPUT_WIDTH: f32 = 120.0; + + ui.horizontal(|ui| { + + // Navigation buttons + if let Some(x) = self.current_directory() { + if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { + let _ = self.load_parent(); + } + } + else { + let _ = ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", false); + } + + if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏴", + self.directory_offset + 1 < self.directory_stack.len()) { + let _ = self.load_previous_directory(); + } + + if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏵", self.directory_offset != 0) { + let _ = self.load_next_directory(); + } + + if ui_button_sized(ui, NAV_BUTTON_SIZE, "+", !self.create_directory_dialog.is_open()) { + if let Some(x) = self.current_directory() { + self.create_directory_dialog.open(x.to_path_buf()); + } + } + + // Current path display + egui::Frame::default() + .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) + .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .rounding(egui::Rounding::from(5.0)) + .show(ui, |ui| { + // TODO: Enable scrolling with mouse wheel + egui::ScrollArea::horizontal() + .auto_shrink([false, false]) + .stick_to_right(true) + // TODO: Dynamically size scroll area to available width + .max_width(500.0) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.style_mut().spacing.item_spacing.x /= 2.5; + + let mut path = PathBuf::new(); + + if let Some(data) = self.current_directory() { + for (i, segment) in data.iter().enumerate() { + path.push(segment); + + if i != 0 { + ui.label(">"); + } + + // TODO: Maybe use selectable_label instead of button? + // TODO: Write current directory (last item) in bold text + if ui.button(segment.to_str().unwrap_or("")) + .clicked() { + let _ = self.load_directory(path.as_path()); + return; + } + } + } + }); + }); + }); + + // Reload button + if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")).clicked() { + self.refresh(); + } + + // Search bar + egui::Frame::default() + .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) + .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .rounding(egui::Rounding::from(5.0)) + .show(ui, |ui| { + ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { + ui.add_space(ctx.style().spacing.item_spacing.y); + ui.label("🔍"); + ui.add_sized(egui::Vec2::new(SEARCH_INPUT_WIDTH, 0.0), + egui::TextEdit::singleline(&mut self.search_value)); + }); + }); + }); + + ui.add_space(ctx.style().spacing.item_spacing.y); + } + + fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { + self.ui_update_user_directories(ui); + + ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); + + self.ui_update_devices(ui); + }); + } + + fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); + + ui.add_space(5.0); + + ui.horizontal(|ui| { + match &self.mode { + DialogMode::SelectDirectory => ui.label("Selected directory:"), + DialogMode::SelectFile => ui.label("Selected file:"), + DialogMode::SaveFile => ui.label("File name:") + }; + + match &self.mode { + DialogMode::SelectDirectory | DialogMode::SelectFile => { + if self.is_selection_valid() { + if let Some(x) = &self.selected_item { + if let Some(name) = self.get_file_name(x) { + ui.colored_label(ui.style().visuals.selection.bg_fill, name); + } + } + } + }, + DialogMode::SaveFile => { + let response = ui.add(egui::TextEdit::singleline(&mut self.file_name_input)); + + if response.changed() { + self.file_name_input_error = self.validate_file_name_input(); + } + + if let Some(x) = &self.file_name_input_error { + // TODO: Use error icon instead + ui.label(x); + } + } + }; + }); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { + let label = match &self.mode { + DialogMode::SelectDirectory | DialogMode::SelectFile => "Open", + DialogMode::SaveFile => "Save" + }; + + if ui_button_sized(ui, BUTTON_SIZE, label, self.is_selection_valid()) { + match &self.mode { + DialogMode::SelectDirectory | DialogMode::SelectFile => { + // self.selected_item should always contain a value, + // since self.is_selection_valid() validates the selection and + // returns false if the selection is none. + if let Some(selection) = self.selected_item.clone() { + self.finish(selection); + } + }, + DialogMode::SaveFile => { + // self.current_directory should always contain a value, + // since self.is_selection_valid() makes sure there is no + // file_name_input_error. The file_name_input_error + // gets validated every time something changes + // by the validate_file_name_input, which sets an error + // if we are currently not in a directory. + if let Some(path) = self.current_directory() { + let mut full_path = path.to_path_buf(); + full_path.push(&self.file_name_input); + + self.finish(full_path); + } + } + } + } + + ui.add_space(ctx.style().spacing.item_spacing.y); + + if ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")).clicked() { + self.cancel(); + } + }); + } + + fn ui_update_central_panel(&mut self, ui: &mut egui::Ui) { + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { + egui::containers::ScrollArea::vertical() + .auto_shrink([false, false]) + .show(ui, |ui| { + // Temporarily take ownership of the directory contents to be able to + // update it in the for loop using load_directory. + // Otherwise we would get an error that `*self` cannot be borrowed as mutable + // more than once at a time. + // Make sure to return the function after updating the directory_content, + // otherwise the change will be overwritten with the last statement of the function. + let data = std::mem::take(&mut self.directory_content); + + for path in data.iter() { + let Some(file_name) = self.get_file_name(path) else { continue; }; + + if !self.search_value.is_empty() && + !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { + continue; + } + + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹" + }; + + let mut selected = false; + if let Some(x) = &self.selected_item { + selected = x == path; + } + + let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); + + if selected && self.scroll_to_selection { + response.scroll_to_me(None); + self.scroll_to_selection = false; + } + + if response.clicked() { + self.select_item(path.as_path()); + } + + if response.double_clicked() { + if path.is_dir() { + let _ = self.load_directory(path); + return; + } + + self.select_item(path.as_path()); + + if self.is_selection_valid() { + // self.selected_item should always contain a value + // since self.is_selection_valid() validates the selection + // and returns false if the selection is none. + if let Some(selection) = self.selected_item.clone() { + self.finish(selection); + } + } + } + } + + self.directory_content = data; + + if let Some(dir) = self.create_directory_dialog.update(ui).directory() { + self.directory_content.push(dir.clone()); + self.select_item(dir.as_path()); + } + }); + }); + } + + fn ui_update_user_directories(&mut self, ui: &mut egui::Ui) { + if let Some(dirs) = self.user_directories.clone() { + ui.label("Places"); + + if ui.selectable_label(self.current_directory() == Some(dirs.home_dir()), + "🏠 Home").clicked() { + let _ = self.load_directory(dirs.home_dir()); + } + + if let Some(path) = dirs.desktop_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🖵 Desktop").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.document_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🗐 Documents").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.download_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "📥 Downloads").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.audio_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🎵 Audio").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.picture_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🖼 Pictures").clicked() { + let _ = self.load_directory(path); + } + } + if let Some(path) = dirs.video_dir() { + if ui.selectable_label(self.current_directory() == Some(path), + "🎞 Videos").clicked() { + let _ = self.load_directory(path); + } + } + } + } + + fn ui_update_devices(&mut self, ui: &mut egui::Ui) { + ui.label("Devices"); + + let disks = std::mem::take(&mut self.system_disks); + + for disk in &disks { + // TODO: Get display name of the devices. + // Currently on linux "/dev/sda1" is returned. + let name = match disk.name().to_str() { + Some(x) => x, + None => continue + }; + + if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { + let _ = self.load_directory(disk.mount_point()); + } + } + + self.system_disks = disks; + } + + fn reset(&mut self) { + self.state = DialogState::Closed; + + self.user_directories = UserDirs::new(); + self.system_disks = Disks::new_with_refreshed_list(); + + self.directory_stack = vec![]; + self.directory_offset = 0; + self.directory_content = vec![]; + + self.create_directory_dialog = CreateDirectoryDialog::new(); + + self.selected_item = None; + self.file_name_input = String::new(); + self.scroll_to_selection = false; + self.search_value = String::new(); + } + + fn refresh(&mut self) { + self.user_directories = UserDirs::new(); + self.system_disks = Disks::new_with_refreshed_list(); + + let _ = self.reload_directory(); + } + + fn finish(&mut self, selected_item: PathBuf) { + self.state = DialogState::Selected(selected_item); + } + + fn cancel(&mut self) { + self.state = DialogState::Cancelled; + } + + fn current_directory(&self) -> Option<&Path> { + if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { + return Some(x.as_path()) + } + + None + } + + fn get_file_name(&self, file: &Path) -> Option { + if let Some(x) = file.file_name() { + if let Some(x) = x.to_str() { + return Some(x.to_string()); + } + } + + None + } + + fn is_selection_valid(&self) -> bool { + if let Some(selection) = &self.selected_item { + let file_name = self.get_file_name(selection); + + return match &self.mode { + DialogMode::SelectDirectory => selection.is_dir() && file_name.is_some(), + DialogMode::SelectFile => selection.is_file() && file_name.is_some(), + DialogMode::SaveFile => self.file_name_input_error.is_none() + }; + } + + if self.mode == DialogMode::SaveFile && self.file_name_input_error.is_none() { + return true; + } + + false + } + + fn validate_file_name_input(&self) -> Option { + if self.file_name_input.is_empty() { + return Some("The file name cannot be empty".to_string()); + } + + if let Some(x) = self.current_directory() { + let mut full_path = x.to_path_buf(); + full_path.push(self.file_name_input.as_str()); + + if full_path.exists() && full_path.is_file() { + return Some("A file with this name already exists".to_string()); + } + } + else { + // There is most likely a bug in the code if we get this error message! + return Some("Currently not in a directory".to_string()) + } + + None + } + + fn select_item(&mut self, path: &Path) { + self.selected_item = Some(path.to_path_buf()); + + if self.mode == DialogMode::SaveFile && path.is_file() { + if let Some(file_name) = self.get_file_name(path) { + self.file_name_input = file_name; + self.file_name_input_error = self.validate_file_name_input(); + } + } + } + + fn load_next_directory(&mut self) -> io::Result<()> { + if self.directory_offset == 0 { + // There is no next directory that can be loaded + return Ok(()); + } + + self.directory_offset -= 1; + + // Copy path and load directory + let path = self.current_directory().unwrap().to_path_buf(); + self.load_directory_content(path.as_path()) + } + + fn load_previous_directory(&mut self) -> io::Result<()> { + if self.directory_offset + 1 >= self.directory_stack.len() { + // There is no previous directory that can be loaded + return Ok(()) + } + + self.directory_offset += 1; + + // Copy path and load directory + let path = self.current_directory().unwrap().to_path_buf(); + self.load_directory_content(path.as_path()) + } + + fn load_parent(&mut self) -> io::Result<()> { + if let Some(x) = self.current_directory() { + if let Some(x) = x.to_path_buf().parent() { + return self.load_directory(x); + } + } + + Ok(()) + } + + fn reload_directory(&mut self) -> io::Result<()> { + if let Some(x) = self.current_directory() { + return self.load_directory_content(x.to_path_buf().as_path()); + } + + Ok(()) + } + + fn load_directory(&mut self, path: &Path) -> io::Result<()> { + // Do not load the same directory again. + // Use reload_directory if the content of the directory should be updated. + if let Some(x) = self.current_directory() { + if x == path { + return Ok(()); + } + } + + if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { + self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); + } + + self.directory_stack.push(fs::canonicalize(path)?); + self.directory_offset = 0; + + self.load_directory_content(path) + } + + fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { + let paths = fs::read_dir(path)?; + + self.create_directory_dialog.close(); + self.directory_content.clear(); + self.scroll_to_selection = true; + + for path in paths { + match path { + Ok(entry) => self.directory_content.push(entry.path()), + _ => continue + }; + } + + // TODO: Sort content to display folders first + // TODO: Implement "Show hidden files and folders" option + + if self.mode == DialogMode::SaveFile { + self.file_name_input_error = self.validate_file_name_input(); + } + + Ok(()) + } +} diff --git a/src/lib.rs b/src/lib.rs index dc130e33..2f3077e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,852 +1,5 @@ -use std::{fs, io}; -use std::path::{Path, PathBuf}; -use directories::UserDirs; -use sysinfo::Disks; +mod file_dialog; +pub use file_dialog::{FileDialog, DialogMode, DialogState}; -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum DialogMode { - SelectFile, - SelectDirectory, - SaveFile -} - -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum DialogState { - Open, - Closed, - Selected(PathBuf), - Cancelled -} - -pub struct FileDialog { - mode: DialogMode, - state: DialogState, - initial_directory: PathBuf, - - user_directories: Option, - system_disks: Disks, - - directory_stack: Vec, - directory_offset: usize, - directory_content: Vec, - - create_directory_dialog: CreateDirectoryDialog, - - selected_item: Option, - file_name_input: String, // Only used when mode = DialogMode::SaveFile - file_name_input_error: Option, - - scroll_to_selection: bool, - search_value: String -} - -impl Default for FileDialog { - fn default() -> Self { - Self::new() - } -} - -impl FileDialog { - pub fn new() -> Self { - FileDialog { - mode: DialogMode::SelectDirectory, - state: DialogState::Closed, - initial_directory: std::env::current_dir().unwrap_or_default(), - - user_directories: UserDirs::new(), - system_disks: Disks::new_with_refreshed_list(), - - directory_stack: vec![], - directory_offset: 0, - directory_content: vec![], - - create_directory_dialog: CreateDirectoryDialog::new(), - - selected_item: None, - file_name_input: String::new(), - file_name_input_error: None, - - scroll_to_selection: false, - search_value: String::new() - } - } - - pub fn initial_directory(mut self, directory: PathBuf) -> Self { - self.initial_directory = directory.clone(); - self - } - - pub fn open(&mut self, mode: DialogMode) { - self.reset(); - - self.mode = mode; - self.state = DialogState::Open; - - // TODO: Error handling - let _ = self.load_directory(&self.initial_directory.clone()); - } - - pub fn select_directory(&mut self) { - self.open(DialogMode::SelectDirectory); - } - - pub fn select_file(&mut self) { - self.open(DialogMode::SelectFile); - } - - pub fn save_file(&mut self) { - self.open(DialogMode::SaveFile); - } - - pub fn mode(&self) -> DialogMode { - self.mode - } - - pub fn state(&self) -> DialogState { - self.state.clone() - } - - pub fn update(&mut self, ctx: &egui::Context) -> &Self { - if self.state != DialogState::Open { - return self; - } - - let mut is_open = true; - - egui::Window::new("File dialog") - .open(&mut is_open) - .default_size([800.0, 500.0]) - .collapsible(false) - .show(ctx, |ui| { - egui::TopBottomPanel::top("fe_top_panel") - .resizable(false) - .show_inside(ui, |ui| { - self.ui_update_top_panel(ctx, ui); - }); - - egui::SidePanel::left("fe_left_panel") - .resizable(true) - .default_width(150.0) - .width_range(100.0..=400.0) - .show_inside(ui, |ui| { - self.update_left_panel(ctx, ui); - }); - - egui::TopBottomPanel::bottom("fe_bottom_panel") - .resizable(false) - .show_inside(ui, |ui| { - self.update_bottom_panel(ctx, ui); - }); - - egui::CentralPanel::default().show_inside(ui, |ui| { - self.ui_update_central_panel(ui); - }); - }); - - // User closed the window without finishing the dialog - if !is_open { - self.cancel(); - } - - self - } - - fn ui_update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); - const SEARCH_INPUT_WIDTH: f32 = 120.0; - - ui.horizontal(|ui| { - - // Navigation buttons - if let Some(x) = self.current_directory() { - if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { - let _ = self.load_parent(); - } - } - else { - let _ = ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", false); - } - - if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏴", - self.directory_offset + 1 < self.directory_stack.len()) { - let _ = self.load_previous_directory(); - } - - if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏵", self.directory_offset != 0) { - let _ = self.load_next_directory(); - } - - if ui_button_sized(ui, NAV_BUTTON_SIZE, "+", !self.create_directory_dialog.is_open()) { - if let Some(x) = self.current_directory() { - self.create_directory_dialog.open(x.to_path_buf()); - } - } - - // Current path display - egui::Frame::default() - .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) - .inner_margin(egui::Margin::symmetric(4.0, 4.0)) - .rounding(egui::Rounding::from(5.0)) - .show(ui, |ui| { - // TODO: Enable scrolling with mouse wheel - egui::ScrollArea::horizontal() - .auto_shrink([false, false]) - .stick_to_right(true) - // TODO: Dynamically size scroll area to available width - .max_width(500.0) - .show(ui, |ui| { - ui.horizontal(|ui| { - ui.style_mut().spacing.item_spacing.x /= 2.5; - - let mut path = PathBuf::new(); - - if let Some(data) = self.current_directory() { - for (i, segment) in data.iter().enumerate() { - path.push(segment); - - if i != 0 { - ui.label(">"); - } - - // TODO: Maybe use selectable_label instead of button? - // TODO: Write current directory (last item) in bold text - if ui.button(segment.to_str().unwrap_or("")) - .clicked() { - let _ = self.load_directory(path.as_path()); - return; - } - } - } - }); - }); - }); - - // Reload button - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")).clicked() { - self.refresh(); - } - - // Search bar - egui::Frame::default() - .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) - .inner_margin(egui::Margin::symmetric(4.0, 4.0)) - .rounding(egui::Rounding::from(5.0)) - .show(ui, |ui| { - ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { - ui.add_space(ctx.style().spacing.item_spacing.y); - ui.label("🔍"); - ui.add_sized(egui::Vec2::new(SEARCH_INPUT_WIDTH, 0.0), - egui::TextEdit::singleline(&mut self.search_value)); - }); - }); - }); - - ui.add_space(ctx.style().spacing.item_spacing.y); - } - - fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { - self.ui_update_user_directories(ui); - - ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - - self.ui_update_devices(ui); - }); - } - - fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { - const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); - - ui.add_space(5.0); - - ui.horizontal(|ui| { - match &self.mode { - DialogMode::SelectDirectory => ui.label("Selected directory:"), - DialogMode::SelectFile => ui.label("Selected file:"), - DialogMode::SaveFile => ui.label("File name:") - }; - - match &self.mode { - DialogMode::SelectDirectory | DialogMode::SelectFile => { - if self.is_selection_valid() { - if let Some(x) = &self.selected_item { - if let Some(name) = self.get_file_name(x) { - ui.colored_label(ui.style().visuals.selection.bg_fill, name); - } - } - } - }, - DialogMode::SaveFile => { - let response = ui.add(egui::TextEdit::singleline(&mut self.file_name_input)); - - if response.changed() { - self.file_name_input_error = self.validate_file_name_input(); - } - - if let Some(x) = &self.file_name_input_error { - // TODO: Use error icon instead - ui.label(x); - } - } - }; - }); - - ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { - let label = match &self.mode { - DialogMode::SelectDirectory | DialogMode::SelectFile => "Open", - DialogMode::SaveFile => "Save" - }; - - if ui_button_sized(ui, BUTTON_SIZE, label, self.is_selection_valid()) { - match &self.mode { - DialogMode::SelectDirectory | DialogMode::SelectFile => { - // self.selected_item should always contain a value, - // since self.is_selection_valid() validates the selection and - // returns false if the selection is none. - if let Some(selection) = self.selected_item.clone() { - self.finish(selection); - } - }, - DialogMode::SaveFile => { - // self.current_directory should always contain a value, - // since self.is_selection_valid() makes sure there is no - // file_name_input_error. The file_name_input_error - // gets validated every time something changes - // by the validate_file_name_input, which sets an error - // if we are currently not in a directory. - if let Some(path) = self.current_directory() { - let mut full_path = path.to_path_buf(); - full_path.push(&self.file_name_input); - - self.finish(full_path); - } - } - } - } - - ui.add_space(ctx.style().spacing.item_spacing.y); - - if ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")).clicked() { - self.cancel(); - } - }); - } - - fn ui_update_central_panel(&mut self, ui: &mut egui::Ui) { - ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { - egui::containers::ScrollArea::vertical() - .auto_shrink([false, false]) - .show(ui, |ui| { - // Temporarily take ownership of the directory contents to be able to - // update it in the for loop using load_directory. - // Otherwise we would get an error that `*self` cannot be borrowed as mutable - // more than once at a time. - // Make sure to return the function after updating the directory_content, - // otherwise the change will be overwritten with the last statement of the function. - let data = std::mem::take(&mut self.directory_content); - - for path in data.iter() { - let Some(file_name) = self.get_file_name(path) else { continue; }; - - if !self.search_value.is_empty() && - !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { - continue; - } - - let icon = match path.is_dir() { - true => "🗀", - _ => "🖹" - }; - - let mut selected = false; - if let Some(x) = &self.selected_item { - selected = x == path; - } - - let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); - - if selected && self.scroll_to_selection { - response.scroll_to_me(None); - self.scroll_to_selection = false; - } - - if response.clicked() { - self.select_item(path.as_path()); - } - - if response.double_clicked() { - if path.is_dir() { - let _ = self.load_directory(path); - return; - } - - self.select_item(path.as_path()); - - if self.is_selection_valid() { - // self.selected_item should always contain a value - // since self.is_selection_valid() validates the selection - // and returns false if the selection is none. - if let Some(selection) = self.selected_item.clone() { - self.finish(selection); - } - } - } - } - - self.directory_content = data; - - if let Some(dir) = self.create_directory_dialog.update(ui).directory() { - self.directory_content.push(dir.clone()); - self.select_item(dir.as_path()); - } - }); - }); - } - - fn ui_update_user_directories(&mut self, ui: &mut egui::Ui) { - if let Some(dirs) = self.user_directories.clone() { - ui.label("Places"); - - if ui.selectable_label(self.current_directory() == Some(dirs.home_dir()), - "🏠 Home").clicked() { - let _ = self.load_directory(dirs.home_dir()); - } - - if let Some(path) = dirs.desktop_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🖵 Desktop").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.document_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🗐 Documents").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.download_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "📥 Downloads").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.audio_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🎵 Audio").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.picture_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🖼 Pictures").clicked() { - let _ = self.load_directory(path); - } - } - if let Some(path) = dirs.video_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🎞 Videos").clicked() { - let _ = self.load_directory(path); - } - } - } - } - - fn ui_update_devices(&mut self, ui: &mut egui::Ui) { - ui.label("Devices"); - - let disks = std::mem::take(&mut self.system_disks); - - for disk in &disks { - // TODO: Get display name of the devices. - // Currently on linux "/dev/sda1" is returned. - let name = match disk.name().to_str() { - Some(x) => x, - None => continue - }; - - if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { - let _ = self.load_directory(disk.mount_point()); - } - } - - self.system_disks = disks; - } - - fn reset(&mut self) { - self.state = DialogState::Closed; - - self.user_directories = UserDirs::new(); - self.system_disks = Disks::new_with_refreshed_list(); - - self.directory_stack = vec![]; - self.directory_offset = 0; - self.directory_content = vec![]; - - self.create_directory_dialog = CreateDirectoryDialog::new(); - - self.selected_item = None; - self.file_name_input = String::new(); - self.scroll_to_selection = false; - self.search_value = String::new(); - } - - fn refresh(&mut self) { - self.user_directories = UserDirs::new(); - self.system_disks = Disks::new_with_refreshed_list(); - - let _ = self.reload_directory(); - } - - fn finish(&mut self, selected_item: PathBuf) { - self.state = DialogState::Selected(selected_item); - } - - fn cancel(&mut self) { - self.state = DialogState::Cancelled; - } - - fn current_directory(&self) -> Option<&Path> { - if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { - return Some(x.as_path()) - } - - None - } - - fn get_file_name(&self, file: &Path) -> Option { - if let Some(x) = file.file_name() { - if let Some(x) = x.to_str() { - return Some(x.to_string()); - } - } - - None - } - - fn is_selection_valid(&self) -> bool { - if let Some(selection) = &self.selected_item { - let file_name = self.get_file_name(selection); - - return match &self.mode { - DialogMode::SelectDirectory => selection.is_dir() && file_name.is_some(), - DialogMode::SelectFile => selection.is_file() && file_name.is_some(), - DialogMode::SaveFile => self.file_name_input_error.is_none() - }; - } - - if self.mode == DialogMode::SaveFile && self.file_name_input_error.is_none() { - return true; - } - - false - } - - fn validate_file_name_input(&self) -> Option { - if self.file_name_input.is_empty() { - return Some("The file name cannot be empty".to_string()); - } - - if let Some(x) = self.current_directory() { - let mut full_path = x.to_path_buf(); - full_path.push(self.file_name_input.as_str()); - - if full_path.exists() && full_path.is_file() { - return Some("A file with this name already exists".to_string()); - } - } - else { - // There is most likely a bug in the code if we get this error message! - return Some("Currently not in a directory".to_string()) - } - - None - } - - fn select_item(&mut self, path: &Path) { - self.selected_item = Some(path.to_path_buf()); - - if self.mode == DialogMode::SaveFile && path.is_file() { - if let Some(file_name) = self.get_file_name(path) { - self.file_name_input = file_name; - self.file_name_input_error = self.validate_file_name_input(); - } - } - } - - fn load_next_directory(&mut self) -> io::Result<()> { - if self.directory_offset == 0 { - // There is no next directory that can be loaded - return Ok(()); - } - - self.directory_offset -= 1; - - // Copy path and load directory - let path = self.current_directory().unwrap().to_path_buf(); - self.load_directory_content(path.as_path()) - } - - fn load_previous_directory(&mut self) -> io::Result<()> { - if self.directory_offset + 1 >= self.directory_stack.len() { - // There is no previous directory that can be loaded - return Ok(()) - } - - self.directory_offset += 1; - - // Copy path and load directory - let path = self.current_directory().unwrap().to_path_buf(); - self.load_directory_content(path.as_path()) - } - - fn load_parent(&mut self) -> io::Result<()> { - if let Some(x) = self.current_directory() { - if let Some(x) = x.to_path_buf().parent() { - return self.load_directory(x); - } - } - - Ok(()) - } - - fn reload_directory(&mut self) -> io::Result<()> { - if let Some(x) = self.current_directory() { - return self.load_directory_content(x.to_path_buf().as_path()); - } - - Ok(()) - } - - fn load_directory(&mut self, path: &Path) -> io::Result<()> { - // Do not load the same directory again. - // Use reload_directory if the content of the directory should be updated. - if let Some(x) = self.current_directory() { - if x == path { - return Ok(()); - } - } - - if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { - self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); - } - - self.directory_stack.push(fs::canonicalize(path)?); - self.directory_offset = 0; - - self.load_directory_content(path) - } - - fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { - let paths = fs::read_dir(path)?; - - self.create_directory_dialog.close(); - self.directory_content.clear(); - self.scroll_to_selection = true; - - for path in paths { - match path { - Ok(entry) => self.directory_content.push(entry.path()), - _ => continue - }; - } - - // TODO: Sort content to display folders first - // TODO: Implement "Show hidden files and folders" option - - if self.mode == DialogMode::SaveFile { - self.file_name_input_error = self.validate_file_name_input(); - } - - Ok(()) - } -} - -struct CreateDirectoryResponse { - directory: Option -} - -impl CreateDirectoryResponse { - pub fn new(directory: &Path) -> Self { - Self { - directory: Some(directory.to_path_buf()) - } - } - - pub fn new_empty() -> Self { - Self { - directory: None - } - } - - pub fn directory(&self) -> Option { - self.directory.clone() - } -} - -struct CreateDirectoryDialog { - open: bool, - init: bool, - directory: Option, - - input: String, - error: Option -} - -impl CreateDirectoryDialog { - pub fn new() -> Self { - Self { - open: false, - init: false, - directory: None, - - input: String::new(), - error: None - } - } - - pub fn open(&mut self, directory: PathBuf) { - self.reset(); - - self.open = true; - self.init = true; - self.directory = Some(directory); - } - - pub fn close(&mut self) { - self.reset(); - } - - pub fn update(&mut self, ui: &mut egui::Ui) -> CreateDirectoryResponse { - - if !self.open { - return CreateDirectoryResponse::new_empty(); - } - - let mut result = CreateDirectoryResponse::new_empty(); - - ui.horizontal(|ui| { - ui.label("🗀"); - - let response = ui.text_edit_singleline(&mut self.input); - - if self.init { - response.scroll_to_me(None); - response.request_focus(); - - self.error = self.validate_input(); - self.init = false; - } - - if response.changed() { - self.error = self.validate_input(); - } - - if ui_button(ui, "✔", self.error.is_none()) { - result = self.create_directory(); - } - - if ui.button("✖").clicked() { - self.close(); - } - - if let Some(err) = &self.error { - // TODO: Use error icon instead - ui.label(err); - } - }); - - result - } - - pub fn is_open(&self) -> bool { - self.open - } - - fn create_directory(&mut self) -> CreateDirectoryResponse { - if let Some(mut dir) = self.directory.clone() { - dir.push(self.input.as_str()); - - match fs::create_dir(&dir) { - Ok(()) => { - self.close(); - return CreateDirectoryResponse::new(dir.as_path()); - } - Err(err) => { - self.error = Some(format!("Error: {}", err)); - return CreateDirectoryResponse::new_empty(); - } - } - } - - // This error should not occur because the create_directory function is only - // called when the dialog is open and the directory is set. - // If this error occurs, there is most likely a bug in the code. - self.error = Some("No directory given".to_string()); - - CreateDirectoryResponse::new_empty() - } - - fn validate_input(&mut self) -> Option { - if self.input.is_empty() { - return Some("Name of the folder can not be empty".to_string()); - } - - if let Some(mut x) = self.directory.clone() { - x.push(self.input.as_str()); - - if x.is_dir() { - return Some("A directory with the name already exists".to_string()) - } - } - else { - // This error should not occur because the validate_input function is only - // called when the dialog is open and the directory is set. - // If this error occurs, there is most likely a bug in the code. - return Some("No directory given".to_string()) - } - - None - } - - fn reset(&mut self) { - self.open = false; - self.init = false; - self.directory = None; - self.input.clear(); - } -} - -#[inline] -fn get_disabled_fill_color(ui: &egui::Ui) -> egui::Color32 { - let c = ui.style().visuals.widgets.noninteractive.bg_fill; - egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100) -} - -fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { - if !enabled { - let button = egui::Button::new(text) - .stroke(egui::Stroke::NONE) - .fill(get_disabled_fill_color(ui)); - - let _ = ui.add(button); - - return false; - } - - ui.add(egui::Button::new(text)).clicked() -} - -fn ui_button_sized(ui: &mut egui::Ui, size: egui::Vec2, text: &str, enabled: bool) -> bool { - if !enabled { - let button = egui::Button::new(text) - .stroke(egui::Stroke::NONE) - .fill(get_disabled_fill_color(ui)); - - let _ = ui.add_sized(size, button); - - return false; - } - - ui.add_sized(size, egui::Button::new(text)).clicked() -} +mod ui; diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 00000000..e6953113 --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,34 @@ + +pub fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { + if !enabled { + let button = egui::Button::new(text) + .stroke(egui::Stroke::NONE) + .fill(get_disabled_fill_color(ui)); + + let _ = ui.add(button); + + return false; + } + + ui.add(egui::Button::new(text)).clicked() +} + +pub fn ui_button_sized(ui: &mut egui::Ui, size: egui::Vec2, text: &str, enabled: bool) -> bool { + if !enabled { + let button = egui::Button::new(text) + .stroke(egui::Stroke::NONE) + .fill(get_disabled_fill_color(ui)); + + let _ = ui.add_sized(size, button); + + return false; + } + + ui.add_sized(size, egui::Button::new(text)).clicked() +} + +#[inline] +fn get_disabled_fill_color(ui: &egui::Ui) -> egui::Color32 { + let c = ui.style().visuals.widgets.noninteractive.bg_fill; + egui::Color32::from_rgba_premultiplied(c.r(), c.g(), c.b(), 100) +} From 7d1b9f54cea994cdee659fc2fa3bab7ae517544e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 20:47:49 +0100 Subject: [PATCH 059/124] Rename ui functions --- src/file_dialog/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index 8740a992..b93af609 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -135,13 +135,13 @@ impl FileDialog { .default_width(150.0) .width_range(100.0..=400.0) .show_inside(ui, |ui| { - self.update_left_panel(ctx, ui); + self.ui_update_left_panel(ctx, ui); }); egui::TopBottomPanel::bottom("fe_bottom_panel") .resizable(false) .show_inside(ui, |ui| { - self.update_bottom_panel(ctx, ui); + self.ui_update_bottom_panel(ctx, ui); }); egui::CentralPanel::default().show_inside(ui, |ui| { @@ -250,7 +250,7 @@ impl FileDialog { ui.add_space(ctx.style().spacing.item_spacing.y); } - fn update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + fn ui_update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { self.ui_update_user_directories(ui); @@ -260,7 +260,7 @@ impl FileDialog { }); } - fn update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { + fn ui_update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); ui.add_space(5.0); From 01bf728e5f0c49dd7ea3bcf39d6e2c581c24ebe7 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 21:03:33 +0100 Subject: [PATCH 060/124] Dynamically set window title --- src/file_dialog/mod.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index b93af609..bf026447 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -36,6 +36,8 @@ pub struct FileDialog { directory_offset: usize, directory_content: Vec, + window_title: String, + create_directory_dialog: CreateDirectoryDialog, selected_item: Option, @@ -66,6 +68,8 @@ impl FileDialog { directory_offset: 0, directory_content: vec![], + window_title: String::from("Select directory"), + create_directory_dialog: CreateDirectoryDialog::new(), selected_item: None, @@ -88,6 +92,12 @@ impl FileDialog { self.mode = mode; self.state = DialogState::Open; + self.window_title = match mode { + DialogMode::SelectDirectory => "📁 Select Folder".to_string(), + DialogMode::SelectFile => "📂 Open File".to_string(), + DialogMode::SaveFile => "📥 Save File".to_string() + }; + // TODO: Error handling let _ = self.load_directory(&self.initial_directory.clone()); } @@ -119,7 +129,7 @@ impl FileDialog { let mut is_open = true; - egui::Window::new("File dialog") + egui::Window::new(&self.window_title) .open(&mut is_open) .default_size([800.0, 500.0]) .collapsible(false) From 47c39b09eae40fab396f44c6e5bcf43a38fa643b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 21:51:59 +0100 Subject: [PATCH 061/124] Dynamically size current path display --- src/file_dialog/mod.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index bf026447..64aed499 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -132,6 +132,7 @@ impl FileDialog { egui::Window::new(&self.window_title) .open(&mut is_open) .default_size([800.0, 500.0]) + .min_width(335.0) .collapsible(false) .show(ctx, |ui| { egui::TopBottomPanel::top("fe_top_panel") @@ -169,7 +170,6 @@ impl FileDialog { fn ui_update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); - const SEARCH_INPUT_WIDTH: f32 = 120.0; ui.horizontal(|ui| { @@ -198,6 +198,9 @@ impl FileDialog { } } + // Leave area for the reload button and search window + let path_display_width = ui.available_width() - 180.0; + // Current path display egui::Frame::default() .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) @@ -209,7 +212,7 @@ impl FileDialog { .auto_shrink([false, false]) .stick_to_right(true) // TODO: Dynamically size scroll area to available width - .max_width(500.0) + .max_width(path_display_width) .show(ui, |ui| { ui.horizontal(|ui| { ui.style_mut().spacing.item_spacing.x /= 2.5; @@ -251,7 +254,7 @@ impl FileDialog { ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { ui.add_space(ctx.style().spacing.item_spacing.y); ui.label("🔍"); - ui.add_sized(egui::Vec2::new(SEARCH_INPUT_WIDTH, 0.0), + ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), egui::TextEdit::singleline(&mut self.search_value)); }); }); From d040515988b2cb667e440d45ca42fec17bd7e257 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 21:58:45 +0100 Subject: [PATCH 062/124] Add scroll area to left panel, update default sizes --- src/file_dialog/mod.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index 64aed499..f9116f70 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -133,6 +133,7 @@ impl FileDialog { .open(&mut is_open) .default_size([800.0, 500.0]) .min_width(335.0) + .min_height(200.0) .collapsible(false) .show(ctx, |ui| { egui::TopBottomPanel::top("fe_top_panel") @@ -144,7 +145,7 @@ impl FileDialog { egui::SidePanel::left("fe_left_panel") .resizable(true) .default_width(150.0) - .width_range(100.0..=400.0) + .width_range(90.0..=250.0) .show_inside(ui, |ui| { self.ui_update_left_panel(ctx, ui); }); @@ -265,11 +266,15 @@ impl FileDialog { fn ui_update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { - self.ui_update_user_directories(ui); + egui::containers::ScrollArea::vertical() + .auto_shrink([false, false]) + .show(ui, |ui| { + self.ui_update_user_directories(ui); - ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); + ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); - self.ui_update_devices(ui); + self.ui_update_devices(ui); + }); }); } From 55bf35e6ef82fc821136f42514052556c522e232 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 23:27:25 +0100 Subject: [PATCH 063/124] Implement custom directory content classes --- src/data/directory_content.rs | 80 +++++++++++++++++++++++++++++++++++ src/data/mod.rs | 3 ++ src/file_dialog/mod.rs | 74 +++++++++++--------------------- src/lib.rs | 1 + 4 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 src/data/directory_content.rs create mode 100644 src/data/mod.rs diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs new file mode 100644 index 00000000..bf49ad54 --- /dev/null +++ b/src/data/directory_content.rs @@ -0,0 +1,80 @@ +use std::path::{Path, PathBuf}; +use std::io; +use std::fs; + +#[derive(Default, Clone, PartialEq, Eq)] +pub struct DirectoryEntry { + path: PathBuf, + is_directory: bool +} + +impl DirectoryEntry { + pub fn from_path(path: &Path) -> Self { + Self { + path: path.to_path_buf(), + is_directory: path.is_dir() + } + } + + pub fn is_dir(&self) -> bool { + self.is_directory + } + + pub fn is_file(&self) -> bool { + !self.is_directory + } + + pub fn to_path_buf(&self) -> PathBuf { + self.path.clone() + } + + pub fn file_name(&self) -> &str { + self.path.file_name().and_then(|name| name.to_str()).unwrap_or_default() + } +} + +#[derive(Default)] +pub struct DirectoryContent { + content: Vec +} + +impl DirectoryContent { + pub fn new() -> Self { + Self { + content: vec![] + } + } + + pub fn from_path(path: &Path) -> io::Result { + Ok(Self { + content: load_directory(path)? + }) + } + + pub fn iter(&self) -> std::slice::Iter<'_, DirectoryEntry> { + self.content.iter() + } + + pub fn push(&mut self, item: DirectoryEntry) { + self.content.push(item); + } +} + +fn load_directory(path: &Path) -> io::Result> { + let paths = fs::read_dir(path)?; + + let mut result: Vec = Vec::new(); + for path in paths { + match path { + Ok(entry) => { + result.push(DirectoryEntry::from_path(entry.path().as_path())) + }, + Err(_) => continue + }; + } + + // TODO: Sort content to display folders first + // TODO: Implement "Show hidden files and folders" option + + Ok(result) +} diff --git a/src/data/mod.rs b/src/data/mod.rs new file mode 100644 index 00000000..668f7103 --- /dev/null +++ b/src/data/mod.rs @@ -0,0 +1,3 @@ + +mod directory_content; +pub use directory_content::{DirectoryContent, DirectoryEntry}; diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index f9116f70..be6d2ef7 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -7,6 +7,7 @@ use sysinfo::Disks; mod create_directory_dialog; use create_directory_dialog::CreateDirectoryDialog; +use crate::data::{DirectoryContent, DirectoryEntry}; use crate::ui::ui_button_sized; #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -34,13 +35,13 @@ pub struct FileDialog { directory_stack: Vec, directory_offset: usize, - directory_content: Vec, + directory_content: DirectoryContent, window_title: String, create_directory_dialog: CreateDirectoryDialog, - selected_item: Option, + selected_item: Option, file_name_input: String, // Only used when mode = DialogMode::SaveFile file_name_input_error: Option, @@ -66,7 +67,7 @@ impl FileDialog { directory_stack: vec![], directory_offset: 0, - directory_content: vec![], + directory_content: DirectoryContent::new(), window_title: String::from("Select directory"), @@ -294,9 +295,7 @@ impl FileDialog { DialogMode::SelectDirectory | DialogMode::SelectFile => { if self.is_selection_valid() { if let Some(x) = &self.selected_item { - if let Some(name) = self.get_file_name(x) { - ui.colored_label(ui.style().visuals.selection.bg_fill, name); - } + ui.colored_label(ui.style().visuals.selection.bg_fill, x.file_name()); } } }, @@ -328,7 +327,7 @@ impl FileDialog { // since self.is_selection_valid() validates the selection and // returns false if the selection is none. if let Some(selection) = self.selected_item.clone() { - self.finish(selection); + self.finish(selection.to_path_buf()); } }, DialogMode::SaveFile => { @@ -370,7 +369,7 @@ impl FileDialog { let data = std::mem::take(&mut self.directory_content); for path in data.iter() { - let Some(file_name) = self.get_file_name(path) else { continue; }; + let file_name = path.file_name(); if !self.search_value.is_empty() && !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { @@ -395,23 +394,23 @@ impl FileDialog { } if response.clicked() { - self.select_item(path.as_path()); + self.select_item(&path); } if response.double_clicked() { if path.is_dir() { - let _ = self.load_directory(path); + let _ = self.load_directory(&path.to_path_buf()); return; } - self.select_item(path.as_path()); + self.select_item(&path); if self.is_selection_valid() { // self.selected_item should always contain a value // since self.is_selection_valid() validates the selection // and returns false if the selection is none. if let Some(selection) = self.selected_item.clone() { - self.finish(selection); + self.finish(selection.to_path_buf()); } } } @@ -419,9 +418,11 @@ impl FileDialog { self.directory_content = data; - if let Some(dir) = self.create_directory_dialog.update(ui).directory() { - self.directory_content.push(dir.clone()); - self.select_item(dir.as_path()); + if let Some(path) = self.create_directory_dialog.update(ui).directory() { + let entry = DirectoryEntry::from_path(&path); + + self.directory_content.push(entry.clone()); + self.select_item(&entry); } }); }); @@ -504,7 +505,7 @@ impl FileDialog { self.directory_stack = vec![]; self.directory_offset = 0; - self.directory_content = vec![]; + self.directory_content = DirectoryContent::new(); self.create_directory_dialog = CreateDirectoryDialog::new(); @@ -537,23 +538,11 @@ impl FileDialog { None } - fn get_file_name(&self, file: &Path) -> Option { - if let Some(x) = file.file_name() { - if let Some(x) = x.to_str() { - return Some(x.to_string()); - } - } - - None - } - fn is_selection_valid(&self) -> bool { if let Some(selection) = &self.selected_item { - let file_name = self.get_file_name(selection); - return match &self.mode { - DialogMode::SelectDirectory => selection.is_dir() && file_name.is_some(), - DialogMode::SelectFile => selection.is_file() && file_name.is_some(), + DialogMode::SelectDirectory => selection.is_dir(), + DialogMode::SelectFile => selection.is_file(), DialogMode::SaveFile => self.file_name_input_error.is_none() }; } @@ -586,14 +575,12 @@ impl FileDialog { None } - fn select_item(&mut self, path: &Path) { - self.selected_item = Some(path.to_path_buf()); + fn select_item(&mut self, dir_entry: &DirectoryEntry) { + self.selected_item = Some(dir_entry.clone()); - if self.mode == DialogMode::SaveFile && path.is_file() { - if let Some(file_name) = self.get_file_name(path) { - self.file_name_input = file_name; - self.file_name_input_error = self.validate_file_name_input(); - } + if self.mode == DialogMode::SaveFile && dir_entry.is_file() { + self.file_name_input = dir_entry.file_name().to_string(); + self.file_name_input_error = self.validate_file_name_input(); } } @@ -661,22 +648,11 @@ impl FileDialog { } fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { - let paths = fs::read_dir(path)?; + self.directory_content = DirectoryContent::from_path(path)?; self.create_directory_dialog.close(); - self.directory_content.clear(); self.scroll_to_selection = true; - for path in paths { - match path { - Ok(entry) => self.directory_content.push(entry.path()), - _ => continue - }; - } - - // TODO: Sort content to display folders first - // TODO: Implement "Show hidden files and folders" option - if self.mode == DialogMode::SaveFile { self.file_name_input_error = self.validate_file_name_input(); } diff --git a/src/lib.rs b/src/lib.rs index 2f3077e3..5073d11c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,3 +3,4 @@ mod file_dialog; pub use file_dialog::{FileDialog, DialogMode, DialogState}; mod ui; +mod data; From 589ed600459c3b75cb7afdde4904ac592c025a7c Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 26 Jan 2024 23:29:57 +0100 Subject: [PATCH 064/124] Fix directory name validation --- src/file_dialog/create_directory_dialog.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/file_dialog/create_directory_dialog.rs b/src/file_dialog/create_directory_dialog.rs index b83820d8..7885b93c 100644 --- a/src/file_dialog/create_directory_dialog.rs +++ b/src/file_dialog/create_directory_dialog.rs @@ -136,8 +136,8 @@ impl CreateDirectoryDialog { if let Some(mut x) = self.directory.clone() { x.push(self.input.as_str()); - if x.is_dir() { - return Some("A directory with the name already exists".to_string()) + if x.exists() { + return Some("A directory or file with the name already exists".to_string()) } } else { From 708dcb0b6f1fd658af43a4cb4777cf42efc9937d Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 13:23:51 +0100 Subject: [PATCH 065/124] Fix file name validation --- src/file_dialog/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index be6d2ef7..75ba4c0a 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -563,8 +563,8 @@ impl FileDialog { let mut full_path = x.to_path_buf(); full_path.push(self.file_name_input.as_str()); - if full_path.exists() && full_path.is_file() { - return Some("A file with this name already exists".to_string()); + if full_path.exists() { + return Some("A file or directory with this name already exists".to_string()); } } else { From 9f5516c078c061699cc8488b8347cd6dcae7b677 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 13:45:12 +0100 Subject: [PATCH 066/124] Rename ui functions --- src/file_dialog/create_directory_dialog.rs | 4 ++-- src/file_dialog/mod.rs | 20 ++++++++++++-------- src/ui.rs | 5 +++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/file_dialog/create_directory_dialog.rs b/src/file_dialog/create_directory_dialog.rs index 7885b93c..95ffba1a 100644 --- a/src/file_dialog/create_directory_dialog.rs +++ b/src/file_dialog/create_directory_dialog.rs @@ -1,7 +1,7 @@ use std::path::{PathBuf, Path}; use std::fs; -use crate::ui::ui_button; +use crate::ui; pub struct CreateDirectoryResponse { directory: Option @@ -83,7 +83,7 @@ impl CreateDirectoryDialog { self.error = self.validate_input(); } - if ui_button(ui, "✔", self.error.is_none()) { + if ui::button_enabled_disabled(ui, "✔", self.error.is_none()) { result = self.create_directory(); } diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index 75ba4c0a..6290072d 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -8,7 +8,7 @@ mod create_directory_dialog; use create_directory_dialog::CreateDirectoryDialog; use crate::data::{DirectoryContent, DirectoryEntry}; -use crate::ui::ui_button_sized; +use crate::ui; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum DialogMode { @@ -177,24 +177,27 @@ impl FileDialog { // Navigation buttons if let Some(x) = self.current_directory() { - if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { + if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", + x.parent().is_some()) { let _ = self.load_parent(); } } else { - let _ = ui_button_sized(ui, NAV_BUTTON_SIZE, "⏶", false); + let _ = ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", false); } - if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏴", - self.directory_offset + 1 < self.directory_stack.len()) { + if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏴", + self.directory_offset + 1 < self.directory_stack.len()) { let _ = self.load_previous_directory(); } - if ui_button_sized(ui, NAV_BUTTON_SIZE, "⏵", self.directory_offset != 0) { + if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏵", + self.directory_offset != 0) { let _ = self.load_next_directory(); } - if ui_button_sized(ui, NAV_BUTTON_SIZE, "+", !self.create_directory_dialog.is_open()) { + if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "+", + !self.create_directory_dialog.is_open()) { if let Some(x) = self.current_directory() { self.create_directory_dialog.open(x.to_path_buf()); } @@ -320,7 +323,8 @@ impl FileDialog { DialogMode::SaveFile => "Save" }; - if ui_button_sized(ui, BUTTON_SIZE, label, self.is_selection_valid()) { + if ui::button_sized_enabled_disabled(ui, BUTTON_SIZE, label, + self.is_selection_valid()) { match &self.mode { DialogMode::SelectDirectory | DialogMode::SelectFile => { // self.selected_item should always contain a value, diff --git a/src/ui.rs b/src/ui.rs index e6953113..5c141a03 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,5 +1,5 @@ -pub fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { +pub fn button_enabled_disabled(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { if !enabled { let button = egui::Button::new(text) .stroke(egui::Stroke::NONE) @@ -13,7 +13,8 @@ pub fn ui_button(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { ui.add(egui::Button::new(text)).clicked() } -pub fn ui_button_sized(ui: &mut egui::Ui, size: egui::Vec2, text: &str, enabled: bool) -> bool { +pub fn button_sized_enabled_disabled(ui: &mut egui::Ui, size: egui::Vec2, text: &str, + enabled: bool) -> bool { if !enabled { let button = egui::Button::new(text) .stroke(egui::Stroke::NONE) From 0173a48fb7efb340982caa6e203aea92f6eff65e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 19:46:06 +0100 Subject: [PATCH 067/124] Improve error messages --- src/file_dialog/create_directory_dialog.rs | 19 +++++++++++-------- src/file_dialog/mod.rs | 7 +++++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/file_dialog/create_directory_dialog.rs b/src/file_dialog/create_directory_dialog.rs index 95ffba1a..4a7af576 100644 --- a/src/file_dialog/create_directory_dialog.rs +++ b/src/file_dialog/create_directory_dialog.rs @@ -90,13 +90,13 @@ impl CreateDirectoryDialog { if ui.button("✖").clicked() { self.close(); } - - if let Some(err) = &self.error { - // TODO: Use error icon instead - ui.label(err); - } }); + if let Some(err) = &self.error { + ui.add_space(5.0); + ui.label(err); + } + result } @@ -136,15 +136,18 @@ impl CreateDirectoryDialog { if let Some(mut x) = self.directory.clone() { x.push(self.input.as_str()); - if x.exists() { - return Some("A directory or file with the name already exists".to_string()) + if x.is_dir() { + return Some("A directory with the name already exists".to_string()); + } + if x.is_file() { + return Some("A file with the name already exists".to_string()); } } else { // This error should not occur because the validate_input function is only // called when the dialog is open and the directory is set. // If this error occurs, there is most likely a bug in the code. - return Some("No directory given".to_string()) + return Some("No directory given".to_string()); } None diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index 6290072d..afbd8b11 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -567,8 +567,11 @@ impl FileDialog { let mut full_path = x.to_path_buf(); full_path.push(self.file_name_input.as_str()); - if full_path.exists() { - return Some("A file or directory with this name already exists".to_string()); + if full_path.is_dir() { + return Some("A directory the name already exists".to_string()); + } + if full_path.is_file() { + return Some("A file with the name already exists".to_string()); } } else { From 29b2b3f2ec20e2fb8e326f00e0a3cb39740ecce6 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 19:50:45 +0100 Subject: [PATCH 068/124] Improve UI of top panel --- src/file_dialog/mod.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index afbd8b11..80bbb497 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -208,15 +208,14 @@ impl FileDialog { // Current path display egui::Frame::default() - .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) + .stroke(egui::Stroke::new(1.0, ctx.style().visuals.window_stroke.color)) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) - .rounding(egui::Rounding::from(5.0)) + .rounding(egui::Rounding::from(4.0)) .show(ui, |ui| { // TODO: Enable scrolling with mouse wheel egui::ScrollArea::horizontal() .auto_shrink([false, false]) .stick_to_right(true) - // TODO: Dynamically size scroll area to available width .max_width(path_display_width) .show(ui, |ui| { ui.horizontal(|ui| { @@ -252,9 +251,9 @@ impl FileDialog { // Search bar egui::Frame::default() - .stroke(egui::Stroke::new(2.0, ctx.style().visuals.window_stroke.color)) + .stroke(egui::Stroke::new(1.0, ctx.style().visuals.window_stroke.color)) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) - .rounding(egui::Rounding::from(5.0)) + .rounding(egui::Rounding::from(4.0)) .show(ui, |ui| { ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { ui.add_space(ctx.style().spacing.item_spacing.y); From 4d8e2035057ef308ad4fcd110b0c09e483cfa92b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 20:17:06 +0100 Subject: [PATCH 069/124] Run rustfmt --- examples/sandbox/src/main.rs | 23 +- src/data/directory_content.rs | 26 +- src/data/mod.rs | 1 - src/file_dialog/create_directory_dialog.rs | 18 +- src/file_dialog/mod.rs | 264 ++++++++++++--------- src/lib.rs | 5 +- src/ui.rs | 9 +- 7 files changed, 192 insertions(+), 154 deletions(-) diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index afef80cb..ecb7f15b 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -1,15 +1,14 @@ - use std::path::PathBuf; use eframe::egui; -use egui_file_dialog::{FileDialog, DialogState, DialogMode}; +use egui_file_dialog::{DialogMode, DialogState, FileDialog}; struct MyApp { file_explorer: FileDialog, selected_directory: Option, selected_file: Option, - saved_file: Option + saved_file: Option, } impl MyApp { @@ -19,7 +18,7 @@ impl MyApp { selected_directory: None, selected_file: None, - saved_file: None + saved_file: None, } } } @@ -52,13 +51,11 @@ impl eframe::App for MyApp { ui.label(format!("File to save: {:?}", self.saved_file)); match self.file_explorer.update(ctx).state() { - DialogState::Selected(path) => { - match self.file_explorer.mode() { - DialogMode::SelectDirectory => self.selected_directory = Some(path), - DialogMode::SelectFile => self.selected_file = Some(path), - DialogMode::SaveFile => self.saved_file = Some(path) - } - } + DialogState::Selected(path) => match self.file_explorer.mode() { + DialogMode::SelectDirectory => self.selected_directory = Some(path), + DialogMode::SelectFile => self.selected_file = Some(path), + DialogMode::SaveFile => self.saved_file = Some(path), + }, _ => {} }; }); @@ -67,13 +64,13 @@ impl eframe::App for MyApp { fn main() -> eframe::Result<()> { let options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default() .with_inner_size([1080.0, 720.0]), + viewport: egui::ViewportBuilder::default().with_inner_size([1080.0, 720.0]), ..Default::default() }; eframe::run_native( "My egui application", options, - Box::new(|ctx| Box::new(MyApp::new(ctx))) + Box::new(|ctx| Box::new(MyApp::new(ctx))), ) } diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index bf49ad54..bdfa1445 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -1,18 +1,17 @@ use std::path::{Path, PathBuf}; -use std::io; -use std::fs; +use std::{fs, io}; #[derive(Default, Clone, PartialEq, Eq)] pub struct DirectoryEntry { path: PathBuf, - is_directory: bool + is_directory: bool, } impl DirectoryEntry { pub fn from_path(path: &Path) -> Self { Self { path: path.to_path_buf(), - is_directory: path.is_dir() + is_directory: path.is_dir(), } } @@ -29,25 +28,26 @@ impl DirectoryEntry { } pub fn file_name(&self) -> &str { - self.path.file_name().and_then(|name| name.to_str()).unwrap_or_default() + self.path + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or_default() } } #[derive(Default)] pub struct DirectoryContent { - content: Vec + content: Vec, } impl DirectoryContent { pub fn new() -> Self { - Self { - content: vec![] - } + Self { content: vec![] } } pub fn from_path(path: &Path) -> io::Result { Ok(Self { - content: load_directory(path)? + content: load_directory(path)?, }) } @@ -66,10 +66,8 @@ fn load_directory(path: &Path) -> io::Result> { let mut result: Vec = Vec::new(); for path in paths { match path { - Ok(entry) => { - result.push(DirectoryEntry::from_path(entry.path().as_path())) - }, - Err(_) => continue + Ok(entry) => result.push(DirectoryEntry::from_path(entry.path().as_path())), + Err(_) => continue, }; } diff --git a/src/data/mod.rs b/src/data/mod.rs index 668f7103..5012cc7b 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -1,3 +1,2 @@ - mod directory_content; pub use directory_content::{DirectoryContent, DirectoryEntry}; diff --git a/src/file_dialog/create_directory_dialog.rs b/src/file_dialog/create_directory_dialog.rs index 4a7af576..ed203678 100644 --- a/src/file_dialog/create_directory_dialog.rs +++ b/src/file_dialog/create_directory_dialog.rs @@ -1,23 +1,21 @@ -use std::path::{PathBuf, Path}; use std::fs; +use std::path::{Path, PathBuf}; use crate::ui; pub struct CreateDirectoryResponse { - directory: Option + directory: Option, } impl CreateDirectoryResponse { pub fn new(directory: &Path) -> Self { Self { - directory: Some(directory.to_path_buf()) + directory: Some(directory.to_path_buf()), } } pub fn new_empty() -> Self { - Self { - directory: None - } + Self { directory: None } } pub fn directory(&self) -> Option { @@ -31,7 +29,7 @@ pub struct CreateDirectoryDialog { directory: Option, input: String, - error: Option + error: Option, } impl CreateDirectoryDialog { @@ -42,7 +40,7 @@ impl CreateDirectoryDialog { directory: None, input: String::new(), - error: None + error: None, } } @@ -59,7 +57,6 @@ impl CreateDirectoryDialog { } pub fn update(&mut self, ui: &mut egui::Ui) -> CreateDirectoryResponse { - if !self.open { return CreateDirectoryResponse::new_empty(); } @@ -142,8 +139,7 @@ impl CreateDirectoryDialog { if x.is_file() { return Some("A file with the name already exists".to_string()); } - } - else { + } else { // This error should not occur because the validate_input function is only // called when the dialog is open and the directory is set. // If this error occurs, there is most likely a bug in the code. diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index 80bbb497..1e7d0051 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -1,5 +1,5 @@ -use std::{fs, io}; use std::path::{Path, PathBuf}; +use std::{fs, io}; use directories::UserDirs; use sysinfo::Disks; @@ -14,7 +14,7 @@ use crate::ui; pub enum DialogMode { SelectFile, SelectDirectory, - SaveFile + SaveFile, } #[derive(Debug, PartialEq, Eq, Clone)] @@ -22,7 +22,7 @@ pub enum DialogState { Open, Closed, Selected(PathBuf), - Cancelled + Cancelled, } pub struct FileDialog { @@ -42,11 +42,11 @@ pub struct FileDialog { create_directory_dialog: CreateDirectoryDialog, selected_item: Option, - file_name_input: String, // Only used when mode = DialogMode::SaveFile + file_name_input: String, // Only used when mode = DialogMode::SaveFile file_name_input_error: Option, scroll_to_selection: bool, - search_value: String + search_value: String, } impl Default for FileDialog { @@ -78,7 +78,7 @@ impl FileDialog { file_name_input_error: None, scroll_to_selection: false, - search_value: String::new() + search_value: String::new(), } } @@ -96,7 +96,7 @@ impl FileDialog { self.window_title = match mode { DialogMode::SelectDirectory => "📁 Select Folder".to_string(), DialogMode::SelectFile => "📂 Open File".to_string(), - DialogMode::SaveFile => "📥 Save File".to_string() + DialogMode::SaveFile => "📥 Save File".to_string(), }; // TODO: Error handling @@ -174,30 +174,40 @@ impl FileDialog { const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); ui.horizontal(|ui| { - // Navigation buttons if let Some(x) = self.current_directory() { - if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", - x.parent().is_some()) { + if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) + { let _ = self.load_parent(); } - } - else { + } else { let _ = ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", false); } - if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏴", - self.directory_offset + 1 < self.directory_stack.len()) { + if ui::button_sized_enabled_disabled( + ui, + NAV_BUTTON_SIZE, + "⏴", + self.directory_offset + 1 < self.directory_stack.len(), + ) { let _ = self.load_previous_directory(); } - if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏵", - self.directory_offset != 0) { + if ui::button_sized_enabled_disabled( + ui, + NAV_BUTTON_SIZE, + "⏵", + self.directory_offset != 0, + ) { let _ = self.load_next_directory(); } - if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "+", - !self.create_directory_dialog.is_open()) { + if ui::button_sized_enabled_disabled( + ui, + NAV_BUTTON_SIZE, + "+", + !self.create_directory_dialog.is_open(), + ) { if let Some(x) = self.current_directory() { self.create_directory_dialog.open(x.to_path_buf()); } @@ -208,7 +218,10 @@ impl FileDialog { // Current path display egui::Frame::default() - .stroke(egui::Stroke::new(1.0, ctx.style().visuals.window_stroke.color)) + .stroke(egui::Stroke::new( + 1.0, + ctx.style().visuals.window_stroke.color, + )) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) .rounding(egui::Rounding::from(4.0)) .show(ui, |ui| { @@ -222,7 +235,7 @@ impl FileDialog { ui.style_mut().spacing.item_spacing.x /= 2.5; let mut path = PathBuf::new(); - + if let Some(data) = self.current_directory() { for (i, segment) in data.iter().enumerate() { path.push(segment); @@ -233,10 +246,10 @@ impl FileDialog { // TODO: Maybe use selectable_label instead of button? // TODO: Write current directory (last item) in bold text - if ui.button(segment.to_str().unwrap_or("")) - .clicked() { - let _ = self.load_directory(path.as_path()); - return; + if ui.button(segment.to_str().unwrap_or("")).clicked() + { + let _ = self.load_directory(path.as_path()); + return; } } } @@ -245,21 +258,29 @@ impl FileDialog { }); // Reload button - if ui.add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")).clicked() { + if ui + .add_sized(NAV_BUTTON_SIZE, egui::Button::new("⟲")) + .clicked() + { self.refresh(); } // Search bar egui::Frame::default() - .stroke(egui::Stroke::new(1.0, ctx.style().visuals.window_stroke.color)) + .stroke(egui::Stroke::new( + 1.0, + ctx.style().visuals.window_stroke.color, + )) .inner_margin(egui::Margin::symmetric(4.0, 4.0)) .rounding(egui::Rounding::from(4.0)) .show(ui, |ui| { ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| { ui.add_space(ctx.style().spacing.item_spacing.y); ui.label("🔍"); - ui.add_sized(egui::Vec2::new(ui.available_width(), 0.0), - egui::TextEdit::singleline(&mut self.search_value)); + ui.add_sized( + egui::Vec2::new(ui.available_width(), 0.0), + egui::TextEdit::singleline(&mut self.search_value), + ); }); }); }); @@ -290,7 +311,7 @@ impl FileDialog { match &self.mode { DialogMode::SelectDirectory => ui.label("Selected directory:"), DialogMode::SelectFile => ui.label("Selected file:"), - DialogMode::SaveFile => ui.label("File name:") + DialogMode::SaveFile => ui.label("File name:"), }; match &self.mode { @@ -300,7 +321,7 @@ impl FileDialog { ui.colored_label(ui.style().visuals.selection.bg_fill, x.file_name()); } } - }, + } DialogMode::SaveFile => { let response = ui.add(egui::TextEdit::singleline(&mut self.file_name_input)); @@ -319,11 +340,11 @@ impl FileDialog { ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { let label = match &self.mode { DialogMode::SelectDirectory | DialogMode::SelectFile => "Open", - DialogMode::SaveFile => "Save" + DialogMode::SaveFile => "Save", }; - if ui::button_sized_enabled_disabled(ui, BUTTON_SIZE, label, - self.is_selection_valid()) { + if ui::button_sized_enabled_disabled(ui, BUTTON_SIZE, label, self.is_selection_valid()) + { match &self.mode { DialogMode::SelectDirectory | DialogMode::SelectFile => { // self.selected_item should always contain a value, @@ -332,7 +353,7 @@ impl FileDialog { if let Some(selection) = self.selected_item.clone() { self.finish(selection.to_path_buf()); } - }, + } DialogMode::SaveFile => { // self.current_directory should always contain a value, // since self.is_selection_valid() makes sure there is no @@ -352,7 +373,10 @@ impl FileDialog { ui.add_space(ctx.style().spacing.item_spacing.y); - if ui.add_sized(BUTTON_SIZE, egui::Button::new("Abort")).clicked() { + if ui + .add_sized(BUTTON_SIZE, egui::Button::new("Abort")) + .clicked() + { self.cancel(); } }); @@ -363,71 +387,76 @@ impl FileDialog { egui::containers::ScrollArea::vertical() .auto_shrink([false, false]) .show(ui, |ui| { - // Temporarily take ownership of the directory contents to be able to - // update it in the for loop using load_directory. - // Otherwise we would get an error that `*self` cannot be borrowed as mutable - // more than once at a time. - // Make sure to return the function after updating the directory_content, - // otherwise the change will be overwritten with the last statement of the function. - let data = std::mem::take(&mut self.directory_content); - - for path in data.iter() { - let file_name = path.file_name(); - - if !self.search_value.is_empty() && - !file_name.to_lowercase().contains(&self.search_value.to_lowercase()) { - continue; - } - - let icon = match path.is_dir() { - true => "🗀", - _ => "🖹" - }; + // Temporarily take ownership of the directory contents to be able to + // update it in the for loop using load_directory. + // Otherwise we would get an error that `*self` cannot be borrowed as mutable + // more than once at a time. + // Make sure to return the function after updating the directory_content, + // otherwise the change will be overwritten with the last statement + // of the function. + let data = std::mem::take(&mut self.directory_content); + + for path in data.iter() { + let file_name = path.file_name(); + + if !self.search_value.is_empty() + && !file_name + .to_lowercase() + .contains(&self.search_value.to_lowercase()) + { + continue; + } - let mut selected = false; - if let Some(x) = &self.selected_item { - selected = x == path; - } + let icon = match path.is_dir() { + true => "🗀", + _ => "🖹", + }; - let response = ui.selectable_label(selected, format!("{} {}", icon, file_name)); + let mut selected = false; + if let Some(x) = &self.selected_item { + selected = x == path; + } - if selected && self.scroll_to_selection { - response.scroll_to_me(None); - self.scroll_to_selection = false; - } + let response = + ui.selectable_label(selected, format!("{} {}", icon, file_name)); - if response.clicked() { - self.select_item(&path); - } + if selected && self.scroll_to_selection { + response.scroll_to_me(None); + self.scroll_to_selection = false; + } - if response.double_clicked() { - if path.is_dir() { - let _ = self.load_directory(&path.to_path_buf()); - return; + if response.clicked() { + self.select_item(&path); } - self.select_item(&path); + if response.double_clicked() { + if path.is_dir() { + let _ = self.load_directory(&path.to_path_buf()); + return; + } + + self.select_item(&path); - if self.is_selection_valid() { - // self.selected_item should always contain a value - // since self.is_selection_valid() validates the selection - // and returns false if the selection is none. - if let Some(selection) = self.selected_item.clone() { - self.finish(selection.to_path_buf()); + if self.is_selection_valid() { + // self.selected_item should always contain a value + // since self.is_selection_valid() validates the selection + // and returns false if the selection is none. + if let Some(selection) = self.selected_item.clone() { + self.finish(selection.to_path_buf()); + } } } } - } - self.directory_content = data; + self.directory_content = data; - if let Some(path) = self.create_directory_dialog.update(ui).directory() { - let entry = DirectoryEntry::from_path(&path); + if let Some(path) = self.create_directory_dialog.update(ui).directory() { + let entry = DirectoryEntry::from_path(&path); - self.directory_content.push(entry.clone()); - self.select_item(&entry); - } - }); + self.directory_content.push(entry.clone()); + self.select_item(&entry); + } + }); }); } @@ -435,44 +464,61 @@ impl FileDialog { if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); - if ui.selectable_label(self.current_directory() == Some(dirs.home_dir()), - "🏠 Home").clicked() { + if ui + .selectable_label( + self.current_directory() == Some(dirs.home_dir()), + "🏠 Home", + ) + .clicked() + { let _ = self.load_directory(dirs.home_dir()); } if let Some(path) = dirs.desktop_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🖵 Desktop").clicked() { + if ui + .selectable_label(self.current_directory() == Some(path), "🖵 Desktop") + .clicked() + { let _ = self.load_directory(path); } } if let Some(path) = dirs.document_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🗐 Documents").clicked() { + if ui + .selectable_label(self.current_directory() == Some(path), "🗐 Documents") + .clicked() + { let _ = self.load_directory(path); } } if let Some(path) = dirs.download_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "📥 Downloads").clicked() { + if ui + .selectable_label(self.current_directory() == Some(path), "📥 Downloads") + .clicked() + { let _ = self.load_directory(path); } } if let Some(path) = dirs.audio_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🎵 Audio").clicked() { + if ui + .selectable_label(self.current_directory() == Some(path), "🎵 Audio") + .clicked() + { let _ = self.load_directory(path); } } if let Some(path) = dirs.picture_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🖼 Pictures").clicked() { + if ui + .selectable_label(self.current_directory() == Some(path), "🖼 Pictures") + .clicked() + { let _ = self.load_directory(path); } } if let Some(path) = dirs.video_dir() { - if ui.selectable_label(self.current_directory() == Some(path), - "🎞 Videos").clicked() { + if ui + .selectable_label(self.current_directory() == Some(path), "🎞 Videos") + .clicked() + { let _ = self.load_directory(path); } } @@ -489,7 +535,7 @@ impl FileDialog { // Currently on linux "/dev/sda1" is returned. let name = match disk.name().to_str() { Some(x) => x, - None => continue + None => continue, }; if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { @@ -535,7 +581,7 @@ impl FileDialog { fn current_directory(&self) -> Option<&Path> { if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { - return Some(x.as_path()) + return Some(x.as_path()); } None @@ -546,7 +592,7 @@ impl FileDialog { return match &self.mode { DialogMode::SelectDirectory => selection.is_dir(), DialogMode::SelectFile => selection.is_file(), - DialogMode::SaveFile => self.file_name_input_error.is_none() + DialogMode::SaveFile => self.file_name_input_error.is_none(), }; } @@ -572,10 +618,9 @@ impl FileDialog { if full_path.is_file() { return Some("A file with the name already exists".to_string()); } - } - else { + } else { // There is most likely a bug in the code if we get this error message! - return Some("Currently not in a directory".to_string()) + return Some("Currently not in a directory".to_string()); } None @@ -606,11 +651,11 @@ impl FileDialog { fn load_previous_directory(&mut self) -> io::Result<()> { if self.directory_offset + 1 >= self.directory_stack.len() { // There is no previous directory that can be loaded - return Ok(()) + return Ok(()); } self.directory_offset += 1; - + // Copy path and load directory let path = self.current_directory().unwrap().to_path_buf(); self.load_directory_content(path.as_path()) @@ -644,7 +689,8 @@ impl FileDialog { } if self.directory_offset != 0 && self.directory_stack.len() > self.directory_offset { - self.directory_stack.drain(self.directory_stack.len() - self.directory_offset..); + self.directory_stack + .drain(self.directory_stack.len() - self.directory_offset..); } self.directory_stack.push(fs::canonicalize(path)?); diff --git a/src/lib.rs b/src/lib.rs index 5073d11c..a293c9dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,5 @@ - mod file_dialog; -pub use file_dialog::{FileDialog, DialogMode, DialogState}; +pub use file_dialog::{DialogMode, DialogState, FileDialog}; -mod ui; mod data; +mod ui; diff --git a/src/ui.rs b/src/ui.rs index 5c141a03..ec4ef758 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,4 +1,3 @@ - pub fn button_enabled_disabled(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { if !enabled { let button = egui::Button::new(text) @@ -13,8 +12,12 @@ pub fn button_enabled_disabled(ui: &mut egui::Ui, text: &str, enabled: bool) -> ui.add(egui::Button::new(text)).clicked() } -pub fn button_sized_enabled_disabled(ui: &mut egui::Ui, size: egui::Vec2, text: &str, - enabled: bool) -> bool { +pub fn button_sized_enabled_disabled( + ui: &mut egui::Ui, + size: egui::Vec2, + text: &str, + enabled: bool, +) -> bool { if !enabled { let button = egui::Button::new(text) .stroke(egui::Stroke::NONE) From f3ea6cece45e14dcc2fa84ba79d1e12ce9847629 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 21:57:25 +0100 Subject: [PATCH 070/124] Add custom Disks and Disk classes --- src/data/disks.rs | 50 ++++++++++++++++++++++++++++++++++++++++++ src/data/mod.rs | 3 +++ src/file_dialog/mod.rs | 17 +++++--------- 3 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 src/data/disks.rs diff --git a/src/data/disks.rs b/src/data/disks.rs new file mode 100644 index 00000000..cb88a3a4 --- /dev/null +++ b/src/data/disks.rs @@ -0,0 +1,50 @@ +use std::path::{Path, PathBuf}; +use sysinfo; + +#[derive(Default, Clone, PartialEq, Eq)] +pub struct Disk { + mount_point: PathBuf, + display_name: String, +} + +impl Disk { + pub fn from_sysinfo_disk(disk: &sysinfo::Disk) -> Self { + Self { + mount_point: disk.mount_point().to_path_buf(), + // TODO: Get display name of the devices. + // Currently on Linux it returns "/dev/sda1" and on Windows it returns an + // empty string for the C:\\ drive. + display_name: disk.name().to_str().unwrap_or_default().to_string(), + } + } + + pub fn mount_point(&self) -> &Path { + &self.mount_point + } + + pub fn display_name(&self) -> &str { + &self.display_name + } +} + +#[derive(Default)] +pub struct Disks { + disks: Vec, +} + +impl Disks { + pub fn new_with_refreshed_list() -> Self { + let disks = sysinfo::Disks::new_with_refreshed_list(); + + let mut result: Vec = Vec::new(); + for disk in disks.iter() { + result.push(Disk::from_sysinfo_disk(disk)); + } + + Self { disks: result } + } + + pub fn iter(&self) -> std::slice::Iter<'_, Disk> { + self.disks.iter() + } +} diff --git a/src/data/mod.rs b/src/data/mod.rs index 5012cc7b..2156b76d 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -1,2 +1,5 @@ mod directory_content; pub use directory_content::{DirectoryContent, DirectoryEntry}; + +mod disks; +pub use disks::Disks; diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index 1e7d0051..bb5665d5 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -2,12 +2,11 @@ use std::path::{Path, PathBuf}; use std::{fs, io}; use directories::UserDirs; -use sysinfo::Disks; mod create_directory_dialog; use create_directory_dialog::CreateDirectoryDialog; -use crate::data::{DirectoryContent, DirectoryEntry}; +use crate::data::{DirectoryContent, DirectoryEntry, Disks}; use crate::ui; #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -530,15 +529,11 @@ impl FileDialog { let disks = std::mem::take(&mut self.system_disks); - for disk in &disks { - // TODO: Get display name of the devices. - // Currently on linux "/dev/sda1" is returned. - let name = match disk.name().to_str() { - Some(x) => x, - None => continue, - }; - - if ui.selectable_label(false, format!("🖴 {}", name)).clicked() { + for disk in disks.iter() { + if ui + .selectable_label(false, format!("🖴 {}", disk.display_name())) + .clicked() + { let _ = self.load_directory(disk.mount_point()); } } From e946fbaeb4053162a4cbdf37b7b7d87fec3d0718 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 22:16:37 +0100 Subject: [PATCH 071/124] Improve github workflow --- .github/workflows/{lint.yml => rust.yml} | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) rename .github/workflows/{lint.yml => rust.yml} (52%) diff --git a/.github/workflows/lint.yml b/.github/workflows/rust.yml similarity index 52% rename from .github/workflows/lint.yml rename to .github/workflows/rust.yml index e6234e3e..f8bea3c6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/rust.yml @@ -1,20 +1,29 @@ on: + push: + branches: + - master + - develop pull_request: branches: - master - develop -name: Clippy check +name: Rust -# Make sure CI fails on all warnings, including Clippy lints env: RUSTFLAGS: "-Dwarnings" jobs: - clippy_check: + lint-fmt: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Run Clippy - run: cargo clippy --all-targets --all-features + - name: Cargo check + run: cargo check + + - name: Rustfmt + run: cargo fmt --all -- --check + + - name: Clippy + run: cargo clippy --all-targets --all-features From 7d456543aaaf38e48c0170c2ade25a2ed418d33d Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 22:20:41 +0100 Subject: [PATCH 072/124] Fix linter errors --- src/data/disks.rs | 1 - src/file_dialog/mod.rs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/data/disks.rs b/src/data/disks.rs index cb88a3a4..dd72bd9e 100644 --- a/src/data/disks.rs +++ b/src/data/disks.rs @@ -1,5 +1,4 @@ use std::path::{Path, PathBuf}; -use sysinfo; #[derive(Default, Clone, PartialEq, Eq)] pub struct Disk { diff --git a/src/file_dialog/mod.rs b/src/file_dialog/mod.rs index bb5665d5..23041877 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog/mod.rs @@ -425,7 +425,7 @@ impl FileDialog { } if response.clicked() { - self.select_item(&path); + self.select_item(path); } if response.double_clicked() { @@ -434,7 +434,7 @@ impl FileDialog { return; } - self.select_item(&path); + self.select_item(path); if self.is_selection_valid() { // self.selected_item should always contain a value From 33246b22ed9819072dd546fc820f7416a368cd92 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 22:30:51 +0100 Subject: [PATCH 073/124] Restructure project --- src/{file_dialog => }/create_directory_dialog.rs | 0 src/{file_dialog/mod.rs => file_dialog.rs} | 3 +-- src/lib.rs | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) rename src/{file_dialog => }/create_directory_dialog.rs (100%) rename src/{file_dialog/mod.rs => file_dialog.rs} (99%) diff --git a/src/file_dialog/create_directory_dialog.rs b/src/create_directory_dialog.rs similarity index 100% rename from src/file_dialog/create_directory_dialog.rs rename to src/create_directory_dialog.rs diff --git a/src/file_dialog/mod.rs b/src/file_dialog.rs similarity index 99% rename from src/file_dialog/mod.rs rename to src/file_dialog.rs index 23041877..af273f1e 100644 --- a/src/file_dialog/mod.rs +++ b/src/file_dialog.rs @@ -3,8 +3,7 @@ use std::{fs, io}; use directories::UserDirs; -mod create_directory_dialog; -use create_directory_dialog::CreateDirectoryDialog; +use crate::create_directory_dialog::CreateDirectoryDialog; use crate::data::{DirectoryContent, DirectoryEntry, Disks}; use crate::ui; diff --git a/src/lib.rs b/src/lib.rs index a293c9dd..050b3ab3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ mod file_dialog; pub use file_dialog::{DialogMode, DialogState, FileDialog}; +mod create_directory_dialog; mod data; mod ui; From be93aaa9efbb89e3cb12d0a5fcca353dd87e5349 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 23:01:50 +0100 Subject: [PATCH 074/124] Improve error handling Add directory errors --- src/file_dialog.rs | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index af273f1e..08ead200 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -34,6 +34,7 @@ pub struct FileDialog { directory_stack: Vec, directory_offset: usize, directory_content: DirectoryContent, + directory_error: Option, window_title: String, @@ -66,6 +67,7 @@ impl FileDialog { directory_stack: vec![], directory_offset: 0, directory_content: DirectoryContent::new(), + directory_error: None, window_title: String::from("Select directory"), @@ -85,7 +87,7 @@ impl FileDialog { self } - pub fn open(&mut self, mode: DialogMode) { + pub fn open(&mut self, mode: DialogMode) -> io::Result<()> { self.reset(); self.mode = mode; @@ -97,20 +99,19 @@ impl FileDialog { DialogMode::SaveFile => "📥 Save File".to_string(), }; - // TODO: Error handling - let _ = self.load_directory(&self.initial_directory.clone()); + self.load_directory(&self.initial_directory.clone()) } pub fn select_directory(&mut self) { - self.open(DialogMode::SelectDirectory); + let _ = self.open(DialogMode::SelectDirectory); } pub fn select_file(&mut self) { - self.open(DialogMode::SelectFile); + let _ = self.open(DialogMode::SelectFile); } pub fn save_file(&mut self) { - self.open(DialogMode::SaveFile); + let _ = self.open(DialogMode::SaveFile); } pub fn mode(&self) -> DialogMode { @@ -176,7 +177,7 @@ impl FileDialog { if let Some(x) = self.current_directory() { if ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", x.parent().is_some()) { - let _ = self.load_parent(); + let _ = self.load_parent_directory(); } } else { let _ = ui::button_sized_enabled_disabled(ui, NAV_BUTTON_SIZE, "⏶", false); @@ -381,6 +382,13 @@ impl FileDialog { } fn ui_update_central_panel(&mut self, ui: &mut egui::Ui) { + if let Some(err) = &self.directory_error { + ui.centered_and_justified(|ui| { + ui.colored_label(egui::Color32::RED, format!("⚠ {}", err)); + }); + return; + } + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { egui::containers::ScrollArea::vertical() .auto_shrink([false, false]) @@ -655,7 +663,7 @@ impl FileDialog { self.load_directory_content(path.as_path()) } - fn load_parent(&mut self) -> io::Result<()> { + fn load_parent_directory(&mut self) -> io::Result<()> { if let Some(x) = self.current_directory() { if let Some(x) = x.to_path_buf().parent() { return self.load_directory(x); @@ -687,14 +695,30 @@ impl FileDialog { .drain(self.directory_stack.len() - self.directory_offset..); } - self.directory_stack.push(fs::canonicalize(path)?); + let full_path = match fs::canonicalize(path) { + Ok(path) => path, + Err(err) => { + self.directory_error = Some(err.to_string()); + return Err(err); + } + }; + + self.directory_stack.push(full_path); self.directory_offset = 0; self.load_directory_content(path) } fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { - self.directory_content = DirectoryContent::from_path(path)?; + self.directory_error = None; + + self.directory_content = match DirectoryContent::from_path(path) { + Ok(content) => content, + Err(err) => { + self.directory_error = Some(err.to_string()); + return Err(err); + } + }; self.create_directory_dialog.close(); self.scroll_to_selection = true; From 5e27b124424775878715ebc1bc23a4512751acc5 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sun, 28 Jan 2024 23:14:21 +0100 Subject: [PATCH 075/124] Update auto scrolling --- src/create_directory_dialog.rs | 2 +- src/file_dialog.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/create_directory_dialog.rs b/src/create_directory_dialog.rs index ed203678..717b3285 100644 --- a/src/create_directory_dialog.rs +++ b/src/create_directory_dialog.rs @@ -69,7 +69,7 @@ impl CreateDirectoryDialog { let response = ui.text_edit_singleline(&mut self.input); if self.init { - response.scroll_to_me(None); + response.scroll_to_me(Some(egui::Align::Center)); response.request_focus(); self.error = self.validate_input(); diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 08ead200..008abcc1 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -427,7 +427,7 @@ impl FileDialog { ui.selectable_label(selected, format!("{} {}", icon, file_name)); if selected && self.scroll_to_selection { - response.scroll_to_me(None); + response.scroll_to_me(Some(egui::Align::Center)); self.scroll_to_selection = false; } From 99246443ff9102dee71c644fee519e0238ab70cc Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 29 Jan 2024 21:16:01 +0100 Subject: [PATCH 076/124] Add option to only list directories --- src/data/directory_content.rs | 13 +++++++++---- src/file_dialog.rs | 15 +++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index bdfa1445..de46a0af 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -45,9 +45,9 @@ impl DirectoryContent { Self { content: vec![] } } - pub fn from_path(path: &Path) -> io::Result { + pub fn from_path(path: &Path, include_files: bool) -> io::Result { Ok(Self { - content: load_directory(path)?, + content: load_directory(path, include_files)?, }) } @@ -60,13 +60,18 @@ impl DirectoryContent { } } -fn load_directory(path: &Path) -> io::Result> { +fn load_directory(path: &Path, include_files: bool) -> io::Result> { let paths = fs::read_dir(path)?; let mut result: Vec = Vec::new(); for path in paths { match path { - Ok(entry) => result.push(DirectoryEntry::from_path(entry.path().as_path())), + Ok(entry) => { + if !include_files && entry.path().is_file() { + continue; + } + result.push(DirectoryEntry::from_path(entry.path().as_path())) + } Err(_) => continue, }; } diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 008abcc1..872ce8ec 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -27,6 +27,7 @@ pub struct FileDialog { mode: DialogMode, state: DialogState, initial_directory: PathBuf, + show_files: bool, user_directories: Option, system_disks: Disks, @@ -60,6 +61,7 @@ impl FileDialog { mode: DialogMode::SelectDirectory, state: DialogState::Closed, initial_directory: std::env::current_dir().unwrap_or_default(), + show_files: true, user_directories: UserDirs::new(), system_disks: Disks::new_with_refreshed_list(), @@ -87,11 +89,12 @@ impl FileDialog { self } - pub fn open(&mut self, mode: DialogMode) -> io::Result<()> { + pub fn open(&mut self, mode: DialogMode, show_files: bool) -> io::Result<()> { self.reset(); self.mode = mode; self.state = DialogState::Open; + self.show_files = show_files; self.window_title = match mode { DialogMode::SelectDirectory => "📁 Select Folder".to_string(), @@ -103,15 +106,15 @@ impl FileDialog { } pub fn select_directory(&mut self) { - let _ = self.open(DialogMode::SelectDirectory); + let _ = self.open(DialogMode::SelectDirectory, false); } pub fn select_file(&mut self) { - let _ = self.open(DialogMode::SelectFile); + let _ = self.open(DialogMode::SelectFile, true); } pub fn save_file(&mut self) { - let _ = self.open(DialogMode::SaveFile); + let _ = self.open(DialogMode::SaveFile, true); } pub fn mode(&self) -> DialogMode { @@ -550,8 +553,8 @@ impl FileDialog { fn reset(&mut self) { self.state = DialogState::Closed; + self.show_files = true; - self.user_directories = UserDirs::new(); self.system_disks = Disks::new_with_refreshed_list(); self.directory_stack = vec![]; @@ -712,7 +715,7 @@ impl FileDialog { fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { self.directory_error = None; - self.directory_content = match DirectoryContent::from_path(path) { + self.directory_content = match DirectoryContent::from_path(path, self.show_files) { Ok(content) => content, Err(err) => { self.directory_error = Some(err.to_string()); From 5eb3d52b1be6bec2696496c5913422d4cc7cf00e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 29 Jan 2024 21:25:09 +0100 Subject: [PATCH 077/124] Exclude system files --- src/data/directory_content.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index de46a0af..a320ac92 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -5,6 +5,7 @@ use std::{fs, io}; pub struct DirectoryEntry { path: PathBuf, is_directory: bool, + is_system_file: bool } impl DirectoryEntry { @@ -12,6 +13,7 @@ impl DirectoryEntry { Self { path: path.to_path_buf(), is_directory: path.is_dir(), + is_system_file: !path.is_dir() && !path.is_file() } } @@ -23,10 +25,18 @@ impl DirectoryEntry { !self.is_directory } + pub fn is_system_file(&self) -> bool { + self.is_system_file + } + pub fn to_path_buf(&self) -> PathBuf { self.path.clone() } + pub fn as_path(&self) -> &Path { + &self.path + } + pub fn file_name(&self) -> &str { self.path .file_name() @@ -67,10 +77,17 @@ fn load_directory(path: &Path, include_files: bool) -> io::Result { - if !include_files && entry.path().is_file() { + let entry = DirectoryEntry::from_path(entry.path().as_path()); + + if entry.is_system_file() { continue; } - result.push(DirectoryEntry::from_path(entry.path().as_path())) + + if !include_files && entry.is_file() { + continue; + } + + result.push(entry); } Err(_) => continue, }; From 814db2b66dd916bb50af43280b6ca7971cc3d42c Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 29 Jan 2024 21:25:35 +0100 Subject: [PATCH 078/124] Remove unused function --- src/data/directory_content.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index a320ac92..eb45f919 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -33,10 +33,6 @@ impl DirectoryEntry { self.path.clone() } - pub fn as_path(&self) -> &Path { - &self.path - } - pub fn file_name(&self) -> &str { self.path .file_name() From 5f2c8eb2aa91221dea54de0ea7ae26a6da08c477 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 29 Jan 2024 22:11:19 +0100 Subject: [PATCH 079/124] Improve scrolling to selection --- src/file_dialog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 872ce8ec..5aebfe1a 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -431,7 +431,6 @@ impl FileDialog { if selected && self.scroll_to_selection { response.scroll_to_me(Some(egui::Align::Center)); - self.scroll_to_selection = false; } if response.clicked() { @@ -457,6 +456,7 @@ impl FileDialog { } } + self.scroll_to_selection = false; self.directory_content = data; if let Some(path) = self.create_directory_dialog.update(ui).directory() { From c37a5925a6364345b0fd42b37b37ddd1e6e18af5 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Mon, 29 Jan 2024 22:15:44 +0100 Subject: [PATCH 080/124] Sort content --- src/data/directory_content.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index eb45f919..ef69c011 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -89,7 +89,14 @@ fn load_directory(path: &Path, include_files: bool) -> io::Result a.file_name().cmp(b.file_name()), + false => match a.is_dir() { + true => std::cmp::Ordering::Less, + false => std::cmp::Ordering::Greater + } + }); + // TODO: Implement "Show hidden files and folders" option Ok(result) From 347f76d84de14e00d7086c5f0f4f69be61ab8403 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 19:43:55 +0100 Subject: [PATCH 081/124] Use custom UserDirectories --- src/data/mod.rs | 3 ++ src/data/user_directories.rs | 73 ++++++++++++++++++++++++++++++++++++ src/file_dialog.rs | 23 ++++++------ 3 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 src/data/user_directories.rs diff --git a/src/data/mod.rs b/src/data/mod.rs index 2156b76d..4d6afc42 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -3,3 +3,6 @@ pub use directory_content::{DirectoryContent, DirectoryEntry}; mod disks; pub use disks::Disks; + +mod user_directories; +pub use user_directories::UserDirectories; diff --git a/src/data/user_directories.rs b/src/data/user_directories.rs new file mode 100644 index 00000000..0e89351f --- /dev/null +++ b/src/data/user_directories.rs @@ -0,0 +1,73 @@ +use std::fs; +use std::path::{Path, PathBuf}; + +#[derive(Default, Clone)] +pub struct UserDirectories { + home_dir: Option, + + audio_dir: Option, + desktop_dir: Option, + document_dir: Option, + download_dir: Option, + picture_dir: Option, + video_dir: Option, +} + +impl UserDirectories { + pub fn new() -> Option { + if let Some(dirs) = directories::UserDirs::new() { + return Some(Self { + home_dir: Self::canonicalize(Some(dirs.home_dir())), + + audio_dir: Self::canonicalize(dirs.audio_dir()), + desktop_dir: Self::canonicalize(dirs.desktop_dir()), + document_dir: Self::canonicalize(dirs.document_dir()), + download_dir: Self::canonicalize(dirs.download_dir()), + picture_dir: Self::canonicalize(dirs.picture_dir()), + video_dir: Self::canonicalize(dirs.video_dir()), + + }); + } + + None + } + + pub fn home_dir(&self) -> Option<&Path> { + self.home_dir.as_ref().map(|p| p.as_path()) + } + + pub fn audio_dir(&self) -> Option<&Path> { + self.audio_dir.as_ref().map(|p| p.as_path()) + } + + pub fn desktop_dir(&self) -> Option<&Path> { + self.desktop_dir.as_ref().map(|p| p.as_path()) + } + + pub fn document_dir(&self) -> Option<&Path> { + self.document_dir.as_ref().map(|p| p.as_path()) + } + + pub fn download_dir(&self) -> Option<&Path> { + self.download_dir.as_ref().map(|p| p.as_path()) + } + + pub fn picture_dir(&self) -> Option<&Path> { + self.picture_dir.as_ref().map(|p| p.as_path()) + } + + pub fn video_dir(&self) -> Option<&Path> { + self.video_dir.as_ref().map(|p| p.as_path()) + } + + fn canonicalize(path: Option<&Path>) -> Option { + if let Some(path) = path { + return match fs::canonicalize(path) { + Ok(p) => Some(p), + Err(_) => None + }; + } + + None + } +} diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 5aebfe1a..67eaed75 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -5,7 +5,7 @@ use directories::UserDirs; use crate::create_directory_dialog::CreateDirectoryDialog; -use crate::data::{DirectoryContent, DirectoryEntry, Disks}; +use crate::data::{DirectoryContent, DirectoryEntry, Disks, UserDirectories}; use crate::ui; #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -29,7 +29,7 @@ pub struct FileDialog { initial_directory: PathBuf, show_files: bool, - user_directories: Option, + user_directories: Option, system_disks: Disks, directory_stack: Vec, @@ -63,7 +63,7 @@ impl FileDialog { initial_directory: std::env::current_dir().unwrap_or_default(), show_files: true, - user_directories: UserDirs::new(), + user_directories: UserDirectories::new(), system_disks: Disks::new_with_refreshed_list(), directory_stack: vec![], @@ -473,14 +473,13 @@ impl FileDialog { if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); - if ui - .selectable_label( - self.current_directory() == Some(dirs.home_dir()), - "🏠 Home", - ) - .clicked() - { - let _ = self.load_directory(dirs.home_dir()); + if let Some(path) = dirs.home_dir() { + if ui + .selectable_label(self.current_directory() == Some(path), "🏠 Home") + .clicked() + { + let _ = self.load_directory(path); + } } if let Some(path) = dirs.desktop_dir() { @@ -570,7 +569,7 @@ impl FileDialog { } fn refresh(&mut self) { - self.user_directories = UserDirs::new(); + self.user_directories = UserDirectories::new(); self.system_disks = Disks::new_with_refreshed_list(); let _ = self.reload_directory(); From de5e42cfaba1e4be1f6a6dec7c6d19d84aaa0242 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 19:44:46 +0100 Subject: [PATCH 082/124] Fix linter error --- src/file_dialog.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 67eaed75..b95416bd 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -1,8 +1,6 @@ use std::path::{Path, PathBuf}; use std::{fs, io}; -use directories::UserDirs; - use crate::create_directory_dialog::CreateDirectoryDialog; use crate::data::{DirectoryContent, DirectoryEntry, Disks, UserDirectories}; From 0eac7a95549f66f0c9a576ecc31362b8ba123f79 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 19:52:58 +0100 Subject: [PATCH 083/124] Update display name of disk --- src/data/disks.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/data/disks.rs b/src/data/disks.rs index dd72bd9e..4d6c0b61 100644 --- a/src/data/disks.rs +++ b/src/data/disks.rs @@ -10,10 +10,7 @@ impl Disk { pub fn from_sysinfo_disk(disk: &sysinfo::Disk) -> Self { Self { mount_point: disk.mount_point().to_path_buf(), - // TODO: Get display name of the devices. - // Currently on Linux it returns "/dev/sda1" and on Windows it returns an - // empty string for the C:\\ drive. - display_name: disk.name().to_str().unwrap_or_default().to_string(), + display_name: Self::gen_display_name(disk), } } @@ -24,6 +21,21 @@ impl Disk { pub fn display_name(&self) -> &str { &self.display_name } + + fn gen_display_name(disk: &sysinfo::Disk) -> String { + // TODO: Get display name of the devices. + // Currently on Linux it returns "/dev/sda1" and on Windows it returns an + // empty string for the C:\\ drive. + let name = disk.name().to_str().unwrap_or_default().to_string(); + + // Try using the mount point as the display name if the specified name + // from sysinfo::Disk is empty or contains invalid characters + if name.is_empty() { + return disk.mount_point().to_str().unwrap_or_default().to_string(); + } + + name + } } #[derive(Default)] From 4e141f7de9d545e88196652b3552566084ac4022 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 21:24:22 +0100 Subject: [PATCH 084/124] Fix current path display on windows --- src/file_dialog.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index b95416bd..29657dd7 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -237,16 +237,42 @@ impl FileDialog { let mut path = PathBuf::new(); if let Some(data) = self.current_directory() { + #[cfg(windows)] + let mut drive_letter = String::from("\\"); + for (i, segment) in data.iter().enumerate() { path.push(segment); + #[cfg(windows)] + let mut file_name = segment.to_str().unwrap_or(""); + + #[cfg(windows)] { + // Skip the path namespace prefix generated by + // fs::canonicalize() on Windows + if i == 0 && file_name.contains(r"\\?\") { + drive_letter = file_name.replace(r"\\?\", ""); + continue; + } + + // Replace the root segment with the disk letter + if i == 1 && segment == "\\" { + file_name = drive_letter.as_str(); + } else if i != 0 { + ui.label(">"); + } + } + + #[cfg(not(windows))] + let file_name = segment.to_str().unwrap_or(""); + + #[cfg(not(windows))] if i != 0 { ui.label(">"); } // TODO: Maybe use selectable_label instead of button? // TODO: Write current directory (last item) in bold text - if ui.button(segment.to_str().unwrap_or("")).clicked() + if ui.button(file_name).clicked() { let _ = self.load_directory(path.as_path()); return; From d8fc10ad3af163081e6fc924c7b3c9d556feaac7 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 21:31:38 +0100 Subject: [PATCH 085/124] Fix linter errors --- src/data/directory_content.rs | 8 ++++---- src/data/user_directories.rs | 3 +-- src/file_dialog.rs | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index ef69c011..e999cc30 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -5,7 +5,7 @@ use std::{fs, io}; pub struct DirectoryEntry { path: PathBuf, is_directory: bool, - is_system_file: bool + is_system_file: bool, } impl DirectoryEntry { @@ -13,7 +13,7 @@ impl DirectoryEntry { Self { path: path.to_path_buf(), is_directory: path.is_dir(), - is_system_file: !path.is_dir() && !path.is_file() + is_system_file: !path.is_dir() && !path.is_file(), } } @@ -93,8 +93,8 @@ fn load_directory(path: &Path, include_files: bool) -> io::Result a.file_name().cmp(b.file_name()), false => match a.is_dir() { true => std::cmp::Ordering::Less, - false => std::cmp::Ordering::Greater - } + false => std::cmp::Ordering::Greater, + }, }); // TODO: Implement "Show hidden files and folders" option diff --git a/src/data/user_directories.rs b/src/data/user_directories.rs index 0e89351f..077baf43 100644 --- a/src/data/user_directories.rs +++ b/src/data/user_directories.rs @@ -25,7 +25,6 @@ impl UserDirectories { download_dir: Self::canonicalize(dirs.download_dir()), picture_dir: Self::canonicalize(dirs.picture_dir()), video_dir: Self::canonicalize(dirs.video_dir()), - }); } @@ -64,7 +63,7 @@ impl UserDirectories { if let Some(path) = path { return match fs::canonicalize(path) { Ok(p) => Some(p), - Err(_) => None + Err(_) => None, }; } diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 29657dd7..8e3b6fc5 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -246,7 +246,8 @@ impl FileDialog { #[cfg(windows)] let mut file_name = segment.to_str().unwrap_or(""); - #[cfg(windows)] { + #[cfg(windows)] + { // Skip the path namespace prefix generated by // fs::canonicalize() on Windows if i == 0 && file_name.contains(r"\\?\") { @@ -272,8 +273,7 @@ impl FileDialog { // TODO: Maybe use selectable_label instead of button? // TODO: Write current directory (last item) in bold text - if ui.button(file_name).clicked() - { + if ui.button(file_name).clicked() { let _ = self.load_directory(path.as_path()); return; } From 0810fc8a5b46e53b18e6a482c3e6db731040b055 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 21:32:58 +0100 Subject: [PATCH 086/124] Add test job to CI/CD --- .github/workflows/rust.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index f8bea3c6..8fd256e4 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -14,7 +14,7 @@ env: RUSTFLAGS: "-Dwarnings" jobs: - lint-fmt: + lint-fmt-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -27,3 +27,6 @@ jobs: - name: Clippy run: cargo clippy --all-targets --all-features + + - name: Test + run: cargo test --all-features From 790d9028e9dd0d0b150b7de30cbae406fda6c5d8 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Tue, 30 Jan 2024 21:35:50 +0100 Subject: [PATCH 087/124] Fix clippy errors --- src/data/user_directories.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/data/user_directories.rs b/src/data/user_directories.rs index 077baf43..d470e891 100644 --- a/src/data/user_directories.rs +++ b/src/data/user_directories.rs @@ -32,31 +32,31 @@ impl UserDirectories { } pub fn home_dir(&self) -> Option<&Path> { - self.home_dir.as_ref().map(|p| p.as_path()) + self.home_dir.as_deref() } pub fn audio_dir(&self) -> Option<&Path> { - self.audio_dir.as_ref().map(|p| p.as_path()) + self.audio_dir.as_deref() } pub fn desktop_dir(&self) -> Option<&Path> { - self.desktop_dir.as_ref().map(|p| p.as_path()) + self.desktop_dir.as_deref() } pub fn document_dir(&self) -> Option<&Path> { - self.document_dir.as_ref().map(|p| p.as_path()) + self.document_dir.as_deref() } pub fn download_dir(&self) -> Option<&Path> { - self.download_dir.as_ref().map(|p| p.as_path()) + self.download_dir.as_deref() } pub fn picture_dir(&self) -> Option<&Path> { - self.picture_dir.as_ref().map(|p| p.as_path()) + self.picture_dir.as_deref() } pub fn video_dir(&self) -> Option<&Path> { - self.video_dir.as_ref().map(|p| p.as_path()) + self.video_dir.as_deref() } fn canonicalize(path: Option<&Path>) -> Option { From 9a625654dab7f092b3334d8c2887a40eb9c3fb74 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 21:09:40 +0100 Subject: [PATCH 088/124] Always show files when DialogMode=SelectFile --- src/file_dialog.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 8e3b6fc5..a743f710 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -87,9 +87,13 @@ impl FileDialog { self } - pub fn open(&mut self, mode: DialogMode, show_files: bool) -> io::Result<()> { + pub fn open(&mut self, mode: DialogMode, mut show_files: bool) -> io::Result<()> { self.reset(); + if mode == DialogMode::SelectFile { + show_files = true; + } + self.mode = mode; self.state = DialogState::Open; self.show_files = show_files; @@ -108,7 +112,7 @@ impl FileDialog { } pub fn select_file(&mut self) { - let _ = self.open(DialogMode::SelectFile, true); + let _ = self.open(DialogMode::SelectFile, false); } pub fn save_file(&mut self) { From b7821baf7c2bab4f8f1313968ff17e95f1e8bdd3 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 21:18:16 +0100 Subject: [PATCH 089/124] Use parent dir if inital_dir is a file --- src/file_dialog.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index a743f710..d27e0000 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -90,6 +90,16 @@ impl FileDialog { pub fn open(&mut self, mode: DialogMode, mut show_files: bool) -> io::Result<()> { self.reset(); + // Try to use the parent directory if the initial directory is a file. + // If the path then has no parent directory, the user will see an error that the path + // does not exist. However, using the user directories or disks, the user is still able + // to select an item or save a file. + if self.initial_directory.is_file() { + if let Some(parent) = self.initial_directory.parent() { + self.initial_directory = parent.to_path_buf(); + } + } + if mode == DialogMode::SelectFile { show_files = true; } From fce3bbefaa0e4136e7cbaa0ef45b44ed495ca7de Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:08:34 +0100 Subject: [PATCH 090/124] Add selected function, update default window size --- src/file_dialog.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index d27e0000..11f19d3e 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -137,6 +137,13 @@ impl FileDialog { self.state.clone() } + pub fn selected(&self) -> Option<&Path> { + match &self.state { + DialogState::Selected(path) => Some(path), + _ => None + } + } + pub fn update(&mut self, ctx: &egui::Context) -> &Self { if self.state != DialogState::Open { return self; @@ -146,7 +153,7 @@ impl FileDialog { egui::Window::new(&self.window_title) .open(&mut is_open) - .default_size([800.0, 500.0]) + .default_size([650.0, 370.0]) .min_width(335.0) .min_height(200.0) .collapsible(false) From 67256b12ba63e3d9c1a2b6401be637a8fd5fd4f7 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:13:29 +0100 Subject: [PATCH 091/124] Add README.md (WIP) --- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++ doc/img/example.png | Bin 0 -> 76353 bytes 2 files changed, 79 insertions(+) create mode 100644 README.md create mode 100644 doc/img/example.png diff --git a/README.md b/README.md new file mode 100644 index 00000000..4232d9bb --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# egui-file-dialog +This repository provides an easy-to-use file dialog (a.k.a. file explorer, file picker) for [egui](https://github.com/emilk/egui). This makes it possible to use a file dialog directly in the egui application without having to rely on the file explorer of the operating system. + +The goal for the future is that parts of the dialog can be dynamically adapted so that it can be used in different situations. One goal, for example, is that the labels can be dynamically adjusted to support different languages. + +![ExampleDialog]("doc/img/example.png") + +The project is currently in a very early version. Some planned features are still missing and some improvements still need to be made. \ +**NOTE**: As long as version 1.0.0 has not yet been reached, even minor version increases may contain breaking changes. + +**Currently only tested on Linux and Windows!** + +## Features +- Select a file or a directory +- Save a file (Prompt user for a destination path) +- Create a new folder +- Navigation buttons to open the parent or previous directories +- Search for items in a directory +- Shortcut for user directories (Home, Documents, ...) and system disks +- Resizable window + +## Example +The following example shows the basic use of the file dialog with [eframe](https://github.com/emilk/egui/tree/master/crates/eframe) to select a file. + +Cargo.toml: +```toml +[dependencies] +eframe = "0.25.0" +egui-file-dialog = "0.1.0" +``` + +main.rs: +```rs +use std::path::PathBuf; + +use eframe::egui; +use egui_file_dialog::FileDialog; + +struct MyApp { + file_dialog: FileDialog, + selected_file: Option, +} + +impl MyApp { + pub fn new(_cc: &eframe::CreationContext) -> Self { + Self { + // Create a new file dialog object + file_dialog: FileDialog::new(), + selected_file: None, + } + } +} + +impl eframe::App for MyApp { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + if ui.button("Select file").clicked() { + // Open the file dialog to select a file. + self.file_dialog.select_file(); + } + + ui.label(format!("Selected file: {:?}", self.selected_file)); + + // Update the dialog and check if the user selected a file + if let Some(path) = self.file_dialog.update(ctx).selected() { + self.selected_file = Some(path.to_path_buf()); + } + }); + } +} + +fn main() -> eframe::Result<()> { + eframe::run_native( + "File dialog demo", + eframe::NativeOptions::default(), + Box::new(|ctx| Box::new(MyApp::new(ctx))), + ) +} +``` diff --git a/doc/img/example.png b/doc/img/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5782d68220acfbeb8c401481286f0e2f4c0ad8 GIT binary patch literal 76353 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 R2>HI~S*bJer!L(3-vDka5FP*k literal 0 HcmV?d00001 From 7357639e5e5e15217c603c73158ab19cfdb1134b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:14:20 +0100 Subject: [PATCH 092/124] Update sandbox --- examples/sandbox/src/main.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/sandbox/src/main.rs b/examples/sandbox/src/main.rs index ecb7f15b..d0a00854 100644 --- a/examples/sandbox/src/main.rs +++ b/examples/sandbox/src/main.rs @@ -4,7 +4,7 @@ use eframe::egui; use egui_file_dialog::{DialogMode, DialogState, FileDialog}; struct MyApp { - file_explorer: FileDialog, + file_dialog: FileDialog, selected_directory: Option, selected_file: Option, @@ -14,7 +14,7 @@ struct MyApp { impl MyApp { pub fn new(_cc: &eframe::CreationContext) -> Self { Self { - file_explorer: FileDialog::new(), + file_dialog: FileDialog::new(), selected_directory: None, selected_file: None, @@ -32,26 +32,26 @@ impl eframe::App for MyApp { ui.add_space(5.0); if ui.button("Select directory").clicked() { - self.file_explorer.select_directory(); + self.file_dialog.select_directory(); } ui.label(format!("Selected directory: {:?}", self.selected_directory)); ui.add_space(5.0); if ui.button("Select file").clicked() { - self.file_explorer.select_file(); + self.file_dialog.select_file(); } ui.label(format!("Selected file: {:?}", self.selected_file)); ui.add_space(5.0); if ui.button("Save file").clicked() { - self.file_explorer.save_file(); + self.file_dialog.save_file(); } ui.label(format!("File to save: {:?}", self.saved_file)); - match self.file_explorer.update(ctx).state() { - DialogState::Selected(path) => match self.file_explorer.mode() { + match self.file_dialog.update(ctx).state() { + DialogState::Selected(path) => match self.file_dialog.mode() { DialogMode::SelectDirectory => self.selected_directory = Some(path), DialogMode::SelectFile => self.selected_file = Some(path), DialogMode::SaveFile => self.saved_file = Some(path), From 51951b1d70aee35880d0c58c0c6a53a1803c90b8 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:15:24 +0100 Subject: [PATCH 093/124] Fix rustfmt error --- src/file_dialog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 11f19d3e..e91ef19f 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -140,7 +140,7 @@ impl FileDialog { pub fn selected(&self) -> Option<&Path> { match &self.state { DialogState::Selected(path) => Some(path), - _ => None + _ => None, } } From 3ef1719ada0e072982c66c5e3eed9d3ec15fc143 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:25:39 +0100 Subject: [PATCH 094/124] Update demo image in README.md --- README.md | 2 +- doc/img/demo.png | Bin 0 -> 39264 bytes doc/img/example.png | Bin 76353 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/img/demo.png delete mode 100644 doc/img/example.png diff --git a/README.md b/README.md index 4232d9bb..5386ea7c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This repository provides an easy-to-use file dialog (a.k.a. file explorer, file The goal for the future is that parts of the dialog can be dynamically adapted so that it can be used in different situations. One goal, for example, is that the labels can be dynamically adjusted to support different languages. -![ExampleDialog]("doc/img/example.png") + The project is currently in a very early version. Some planned features are still missing and some improvements still need to be made. \ **NOTE**: As long as version 1.0.0 has not yet been reached, even minor version increases may contain breaking changes. diff --git a/doc/img/demo.png b/doc/img/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..211a96bc8ac4fa845b941cdc1f26c788f9272556 GIT binary patch literal 39264 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

b0mstC9 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 Q75*o8;V(tb~vxn}jm5>77loSN7(9 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 R2>HI~S*bJer!L(3-vDka5FP*k From 46ff39f4a489475e11d6f9b8401c244b07059b46 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:27:12 +0100 Subject: [PATCH 095/124] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5386ea7c..bd703c81 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # egui-file-dialog This repository provides an easy-to-use file dialog (a.k.a. file explorer, file picker) for [egui](https://github.com/emilk/egui). This makes it possible to use a file dialog directly in the egui application without having to rely on the file explorer of the operating system. + + The goal for the future is that parts of the dialog can be dynamically adapted so that it can be used in different situations. One goal, for example, is that the labels can be dynamically adjusted to support different languages. - +The project is currently in a very early version. Some planned features are still missing and some improvements still need to be made. -The project is currently in a very early version. Some planned features are still missing and some improvements still need to be made. \ **NOTE**: As long as version 1.0.0 has not yet been reached, even minor version increases may contain breaking changes. **Currently only tested on Linux and Windows!** From 7b30b85730e4cdaa7bd9e55c3f1744be6baadad1 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Wed, 31 Jan 2024 22:30:10 +0100 Subject: [PATCH 096/124] Add LICENSE --- LICENSE | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..3e6048bb --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +Copyright 2024 fluxxcode + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + From dbd7290eab17ef39b91e3431c4a5ac11e92a0868 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 19:19:23 +0100 Subject: [PATCH 097/124] Add spacing before places --- src/file_dialog.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index e91ef19f..8345f92f 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -340,6 +340,8 @@ impl FileDialog { egui::containers::ScrollArea::vertical() .auto_shrink([false, false]) .show(ui, |ui| { + ui.add_space(ctx.style().spacing.item_spacing.y * 2.0); + self.ui_update_user_directories(ui); ui.add_space(ctx.style().spacing.item_spacing.y * 4.0); From c03807f2a81f22df8ed7ff4eaccb8be4cd984fe3 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 19:29:42 +0100 Subject: [PATCH 098/124] Add example save_file --- examples/save_file/Cargo.toml | 10 +++++++ examples/save_file/README.md | 7 +++++ examples/save_file/screenshot.png | Bin 0 -> 40873 bytes examples/save_file/src/main.rs | 42 ++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 examples/save_file/Cargo.toml create mode 100644 examples/save_file/README.md create mode 100644 examples/save_file/screenshot.png create mode 100644 examples/save_file/src/main.rs diff --git a/examples/save_file/Cargo.toml b/examples/save_file/Cargo.toml new file mode 100644 index 00000000..85a7c9c1 --- /dev/null +++ b/examples/save_file/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "save_file" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +eframe = { version = "0.25.0", default-features = false, features = ["glow"] } +egui-file-dialog = { version = "0.1.0", path = "../../"} diff --git a/examples/save_file/README.md b/examples/save_file/README.md new file mode 100644 index 00000000..266c5fa9 --- /dev/null +++ b/examples/save_file/README.md @@ -0,0 +1,7 @@ +Example showing how to save a file using the file dialog. + +``` +cargo run -p save_file +``` + +![](screenshot.png) diff --git a/examples/save_file/screenshot.png b/examples/save_file/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..48c1e54f521bf4ca7c9b7b8c01be9681893d4671 GIT binary patch literal 40873 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 O%|*)=M$O;+)Bgc+4?>#& literal 0 HcmV?d00001 diff --git a/examples/save_file/src/main.rs b/examples/save_file/src/main.rs new file mode 100644 index 00000000..0990ed15 --- /dev/null +++ b/examples/save_file/src/main.rs @@ -0,0 +1,42 @@ +use std::path::PathBuf; + +use eframe::egui; +use egui_file_dialog::FileDialog; + +struct MyApp { + file_dialog: FileDialog, + file_path: Option, +} + +impl MyApp { + pub fn new(_cc: &eframe::CreationContext) -> Self { + Self { + file_dialog: FileDialog::new(), + file_path: None, + } + } +} + +impl eframe::App for MyApp { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + if ui.button("Save file").clicked() { + self.file_dialog.save_file(); + } + + ui.label(format!("File to save: {:?}", self.file_path)); + + if let Some(path) = self.file_dialog.update(ctx).selected() { + self.file_path = Some(path.to_path_buf()); + } + }); + } +} + +fn main() -> eframe::Result<()> { + eframe::run_native( + "File dialog example", + eframe::NativeOptions::default(), + Box::new(|ctx| Box::new(MyApp::new(ctx))), + ) +} From 34eed29afd8efa0dcdc7e6e58e41ad1dcb7ea66c Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 19:29:57 +0100 Subject: [PATCH 099/124] Add example select_directory --- examples/select_directory/Cargo.toml | 10 ++++++ examples/select_directory/README.md | 7 ++++ examples/select_directory/screenshot.png | Bin 0 -> 36181 bytes examples/select_directory/src/main.rs | 42 +++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 examples/select_directory/Cargo.toml create mode 100644 examples/select_directory/README.md create mode 100644 examples/select_directory/screenshot.png create mode 100644 examples/select_directory/src/main.rs diff --git a/examples/select_directory/Cargo.toml b/examples/select_directory/Cargo.toml new file mode 100644 index 00000000..fd7097ce --- /dev/null +++ b/examples/select_directory/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "select_directory" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +eframe = { version = "0.25.0", default-features = false, features = ["glow"] } +egui-file-dialog = { version = "0.1.0", path = "../../"} diff --git a/examples/select_directory/README.md b/examples/select_directory/README.md new file mode 100644 index 00000000..a53d2051 --- /dev/null +++ b/examples/select_directory/README.md @@ -0,0 +1,7 @@ +Example showing how to select a directory using the file dialog. + +``` +cargo run -p select_directory +``` + +![](screenshot.png) diff --git a/examples/select_directory/screenshot.png b/examples/select_directory/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f370a4c45f6359281c1655d0439d0d93828f1839 GIT binary patch literal 36181 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, +} + +impl MyApp { + pub fn new(_cc: &eframe::CreationContext) -> Self { + Self { + file_dialog: FileDialog::new(), + selected_directory: None, + } + } +} + +impl eframe::App for MyApp { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + if ui.button("Select directory").clicked() { + self.file_dialog.select_directory(); + } + + ui.label(format!("Selected directory: {:?}", self.selected_directory)); + + if let Some(path) = self.file_dialog.update(ctx).selected() { + self.selected_directory = Some(path.to_path_buf()); + } + }); + } +} + +fn main() -> eframe::Result<()> { + eframe::run_native( + "File dialog example", + eframe::NativeOptions::default(), + Box::new(|ctx| Box::new(MyApp::new(ctx))), + ) +} From 25b7701ba50f3f9185e2a35646ac1b0168e7022c Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 19:30:06 +0100 Subject: [PATCH 100/124] Add example select_file --- examples/select_file/Cargo.toml | 10 +++++++ examples/select_file/README.md | 7 +++++ examples/select_file/screenshot.png | Bin 0 -> 40652 bytes examples/select_file/src/main.rs | 42 ++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 examples/select_file/Cargo.toml create mode 100644 examples/select_file/README.md create mode 100644 examples/select_file/screenshot.png create mode 100644 examples/select_file/src/main.rs diff --git a/examples/select_file/Cargo.toml b/examples/select_file/Cargo.toml new file mode 100644 index 00000000..3ba49999 --- /dev/null +++ b/examples/select_file/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "select_file" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +eframe = { version = "0.25.0", default-features = false, features = ["glow"] } +egui-file-dialog = { version = "0.1.0", path = "../../"} diff --git a/examples/select_file/README.md b/examples/select_file/README.md new file mode 100644 index 00000000..9b56fc1d --- /dev/null +++ b/examples/select_file/README.md @@ -0,0 +1,7 @@ +Example showing how to select a file using the file dialog. + +``` +cargo run -p select_file +``` + +![](screenshot.png) diff --git a/examples/select_file/screenshot.png b/examples/select_file/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..40342ce3aef9831cd789bcfc910de4bcb8eef039 GIT binary patch literal 40652 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, +} + +impl MyApp { + pub fn new(_cc: &eframe::CreationContext) -> Self { + Self { + file_dialog: FileDialog::new(), + selected_file: None, + } + } +} + +impl eframe::App for MyApp { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + if ui.button("Select file").clicked() { + self.file_dialog.select_file(); + } + + ui.label(format!("Selected file: {:?}", self.selected_file)); + + if let Some(path) = self.file_dialog.update(ctx).selected() { + self.selected_file = Some(path.to_path_buf()); + } + }); + } +} + +fn main() -> eframe::Result<()> { + eframe::run_native( + "File dialog example", + eframe::NativeOptions::default(), + Box::new(|ctx| Box::new(MyApp::new(ctx))), + ) +} From 250b88d1cb7861954651b4e55d9ec7a6513efa3e Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 19:32:10 +0100 Subject: [PATCH 101/124] Add README.md to sandbox example --- examples/sandbox/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 examples/sandbox/README.md diff --git a/examples/sandbox/README.md b/examples/sandbox/README.md new file mode 100644 index 00000000..0a76cb61 --- /dev/null +++ b/examples/sandbox/README.md @@ -0,0 +1,5 @@ +Sandbox app used during development of the file exporter. + +``` +cargo run -p sandbox +``` From a78c8c8809d81ae3122d7ecffcfb8a0648708cc6 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 20:05:06 +0100 Subject: [PATCH 102/124] Add lib.rs doc --- src/lib.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 050b3ab3..ce703ea2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,52 @@ +//! # egui-file-dialog +//! +//! An easy-to-use file dialog (a.k.a. file explorer, file picker) for [egui](https://github.com/emilk/egui). +//! +//! The project is currently in a very early version. Some planned features are still missing and some improvements still need to be made. +//! +//! **Currently only tested on Linux and Windows!** +//! +//! Read more about the project: +//! +//! ### Features +//! - Select a file or a directory +//! - Save a file (Prompt user for a destination path) +//! - Create a new folder +//! - Navigation buttons to open the parent or previous directories +//! - Search for items in a directory +//! - Shortcut for user directories (Home, Documents, ...) and system disks +//! - Resizable window +//! +//! ### A simple example +//! +//! The following example shows of how you can use the file dialog to let the user select a file. \ +//! See the full example at: +//! +//! ```rust +//! use std::path::PathBuf; +//! +//! use eframe::egui; +//! use egui_file_dialog::FileDialog; +//! +//! struct MyApp { +//! file_dialog: FileDialog::new(), +//! } +//! +//! impl eframe::App for MyApp { +//! fn update(ctx: &egui::Context) { +//! if ui.button("Select file").clicked() { +//! // Open the file dialog to select a file +//! self.file_dialog.select_file(); +//! } +//! +//! // Update the dialog and check if the user selected a file +//! if let Some(path) = self.file_dialog.update(ctx).selected() { +//! println!("Selected file: {:?}", path); +//! } +//! } +//! } +//! ``` + mod file_dialog; pub use file_dialog::{DialogMode, DialogState, FileDialog}; From 8111423767079a28f52a747d86686c9b8f7c5829 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 20:28:42 +0100 Subject: [PATCH 103/124] Update lib.rs doc --- src/lib.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ce703ea2..4e2176fb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,7 +16,7 @@ //! - Search for items in a directory //! - Shortcut for user directories (Home, Documents, ...) and system disks //! - Resizable window -//! +//! //! ### A simple example //! //! The following example shows of how you can use the file dialog to let the user select a file. \ @@ -29,11 +29,20 @@ //! use egui_file_dialog::FileDialog; //! //! struct MyApp { -//! file_dialog: FileDialog::new(), +//! file_dialog: FileDialog, //! } //! +//! impl MyApp { +//! pub fn new(_cc: &eframe::CreationContext) -> Self { +//! Self { +//! // Create a new FileDialog instance +//! file_dialog: FileDialog::new(), +//! } +//! } +//! } +//! //! impl eframe::App for MyApp { -//! fn update(ctx: &egui::Context) { +//! fn update(&mut self, ctx: &egui::Context) { //! if ui.button("Select file").clicked() { //! // Open the file dialog to select a file //! self.file_dialog.select_file(); From 1afda362b08bebbb4ac13e3863b407f8adf437eb Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 21:25:33 +0100 Subject: [PATCH 104/124] Add code documentation of file_dialog.rs --- src/file_dialog.rs | 139 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 8345f92f..2177e470 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -1,3 +1,5 @@ +#![warn(missing_docs)] // Let's keep the public API well documented! + use std::path::{Path, PathBuf}; use std::{fs, io}; @@ -6,54 +8,118 @@ use crate::create_directory_dialog::CreateDirectoryDialog; use crate::data::{DirectoryContent, DirectoryEntry, Disks, UserDirectories}; use crate::ui; +/// Represents the mode the file dialog is currently in. #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum DialogMode { + /// When the dialog is currently used to select a file SelectFile, + + /// When the dialog is currently used to select a directory SelectDirectory, + + /// When the dialog is currently used to save a file SaveFile, } +/// Represents the state the file dialog is currently in. #[derive(Debug, PartialEq, Eq, Clone)] pub enum DialogState { + /// The dialog is currently open and the user can perform the desired actions. Open, + + /// The dialog is currently closed and not visible. Closed, + + /// The user has selected a folder or file or specified a destination path for saving a file. Selected(PathBuf), + + /// The user cancelled the dialog and didn't select anything. Cancelled, } +/// Represents a file dialog instance. +/// +/// The `FileDialog` instance can be used multiple times and for different actions. +/// +/// # Examples +/// ```rust +/// struct MyApp { +/// file_dialog: FileDialog, +/// } +/// +/// fn update(&mut self ctx: &egui::Context, ui: &mut egui::Ui) { +/// if ui.button("Select a file").clicked { +/// self.file_dialog.select_file(); +/// } +/// +/// if let Some(path) = self.file_dialog.update(ctx).selected() { +/// println!("Selected file: {:?}", path); +/// } +/// } +/// ``` pub struct FileDialog { + /// The mode the dialog is currently in mode: DialogMode, + /// The state the dialog is currently in state: DialogState, + /// The first directory that will be opened when the dialog opens initial_directory: PathBuf, + /// If files are displayed in addition to directories. + /// This option will be ignored when mode == DialogMode::SelectFile. show_files: bool, + /// The user directories like Home or Documents. + /// These are loaded once when the dialog is created or when the refresh() method is called. user_directories: Option, + /// The currently mounted system disks. + /// These are loaded once when the dialog is created or when the refresh() method is called. system_disks: Disks, + /// Contains the directories that the user opened. Every newly opened directory + /// is pushed to the vector. + /// Used for the navigation buttons to load the previous or next directory. directory_stack: Vec, + /// An offset from the back of directory_stack telling which directory is currently open. + /// If 0, the user is currently in the latest open directory. + /// If not 0, the user has used the "Previous directory" button and has + /// opened previously opened directories. directory_offset: usize, + /// The content of the currently open directory directory_content: DirectoryContent, + /// This variable contains the error message if an error occurred while loading the directory. directory_error: Option, + /// The currently used window title. + /// This changes depending on the mode the dialog is in. window_title: String, + /// The dialog that is shown when the user wants to create a new directory. create_directory_dialog: CreateDirectoryDialog, + /// The item that the user currently selected. + /// Can be a directory or a folder. selected_item: Option, - file_name_input: String, // Only used when mode = DialogMode::SaveFile + /// Buffer for the input of the file name when the dialog is in "SaveFile" mode. + file_name_input: String, + /// This variables contains the error message if the file_name_input is invalid. + /// This can be the case, for example, if a file or folder with the name already exists. file_name_input_error: Option, + /// If we should scroll to the item selected by the user in the next frame. scroll_to_selection: bool, + /// Buffer containing the value of the search input. search_value: String, } impl Default for FileDialog { + /// Creates a new `FileDialog` instance with default values. fn default() -> Self { Self::new() } } impl FileDialog { + /// Creates a new `FileDialog` instance with default values. pub fn new() -> Self { FileDialog { mode: DialogMode::SelectDirectory, @@ -82,11 +148,22 @@ impl FileDialog { } } + /// Sets the first loaded directory when the dialog opens. + /// If the path is a file, the file's parent directory is used. If the path then has no + /// parent directory or cannot be loaded, the user will receive an error that the + /// directory cannot be loaded. pub fn initial_directory(mut self, directory: PathBuf) -> Self { self.initial_directory = directory.clone(); self } + /// Opens the file dialog in the given mode with the given options. + /// This function resets the file dialog and takes care for the variables that need to be + /// set when opening the file dialog. + /// + /// Returns the result of the operation to load the initial_directory. + /// + /// The show_files parameter will be ignored when mode == DialogMode::SelectFile. pub fn open(&mut self, mode: DialogMode, mut show_files: bool) -> io::Result<()> { self.reset(); @@ -117,26 +194,43 @@ impl FileDialog { self.load_directory(&self.initial_directory.clone()) } + /// Shortcut function to open the file dialog to prompt the user to select a directory. + /// If used, no files in the directories will be shown to the user. + /// Use the `open()` method instead, if you still want to display files to the user. + /// + /// The function ignores the result of the initial directory loading operation. pub fn select_directory(&mut self) { let _ = self.open(DialogMode::SelectDirectory, false); } + /// Shortcut function to open the file dialog to prompt the user to select a file. + /// + /// The function ignores the result of the initial directory loading operation. pub fn select_file(&mut self) { let _ = self.open(DialogMode::SelectFile, false); } + /// Shortcut function to open the file dialog to prompt the user to save a file. + /// + /// The function ignores the result of the initial directory loading operation. pub fn save_file(&mut self) { let _ = self.open(DialogMode::SaveFile, true); } + /// Returns the mode the dialog is currently in. pub fn mode(&self) -> DialogMode { self.mode } + /// Returns the state the dialog is currently in. pub fn state(&self) -> DialogState { self.state.clone() } + /// Returns the directory or file that the user selected, or the target file + /// if the dialog mode is DialogMode::SaveFile. + /// + /// None is returned when the user has not yet selected an item. pub fn selected(&self) -> Option<&Path> { match &self.state { DialogState::Selected(path) => Some(path), @@ -144,6 +238,9 @@ impl FileDialog { } } + /// The main update method that should be called every frame if the dialog is to be visible. + /// + /// This function has no effect if the dialog state is currently not `DialogState::Open`. pub fn update(&mut self, ctx: &egui::Context) -> &Self { if self.state != DialogState::Open { return self; @@ -191,6 +288,8 @@ impl FileDialog { self } + /// Updates the top panel of the dialog. Including the navigation buttons, + /// the current path display, the reload button and the search field. fn ui_update_top_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { const NAV_BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(25.0, 25.0); @@ -335,6 +434,8 @@ impl FileDialog { ui.add_space(ctx.style().spacing.item_spacing.y); } + /// Updates the left panel of the dialog. Including the list of the user directories (Places) + /// and system disks. fn ui_update_left_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { egui::containers::ScrollArea::vertical() @@ -351,6 +452,7 @@ impl FileDialog { }); } + /// Updates the bottom panel showing the selected item and main action buttons. fn ui_update_bottom_panel(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { const BUTTON_SIZE: egui::Vec2 = egui::Vec2::new(78.0, 20.0); @@ -431,6 +533,7 @@ impl FileDialog { }); } + /// Updates the central panel, including the list of items in the currently open directory. fn ui_update_central_panel(&mut self, ui: &mut egui::Ui) { if let Some(err) = &self.directory_error { ui.centered_and_justified(|ui| { @@ -516,6 +619,7 @@ impl FileDialog { }); } + /// Updates the list of the user directories (Places). fn ui_update_user_directories(&mut self, ui: &mut egui::Ui) { if let Some(dirs) = self.user_directories.clone() { ui.label("Places"); @@ -580,6 +684,7 @@ impl FileDialog { } } + /// Updates the list of the system disks (Disks). fn ui_update_devices(&mut self, ui: &mut egui::Ui) { ui.label("Devices"); @@ -597,6 +702,8 @@ impl FileDialog { self.system_disks = disks; } + /// Resets the dialog to use default values. + /// Configuration variables such as `initial_directory` are retained. fn reset(&mut self) { self.state = DialogState::Closed; self.show_files = true; @@ -615,6 +722,8 @@ impl FileDialog { self.search_value = String::new(); } + /// Refreshes the dialog. + /// Including the user directories, system disks and currently open directory. fn refresh(&mut self) { self.user_directories = UserDirectories::new(); self.system_disks = Disks::new_with_refreshed_list(); @@ -622,14 +731,18 @@ impl FileDialog { let _ = self.reload_directory(); } + /// Finishes the dialog. + /// `selected_item`` is the item that was selected by the user. fn finish(&mut self, selected_item: PathBuf) { self.state = DialogState::Selected(selected_item); } + /// Cancels the dialog. fn cancel(&mut self) { self.state = DialogState::Cancelled; } + /// Gets the currently open directory. fn current_directory(&self) -> Option<&Path> { if let Some(x) = self.directory_stack.iter().nth_back(self.directory_offset) { return Some(x.as_path()); @@ -638,6 +751,8 @@ impl FileDialog { None } + /// Checks whether the selection or the file name entered is valid. + /// What is checked depends on the mode the dialog is currently in. fn is_selection_valid(&self) -> bool { if let Some(selection) = &self.selected_item { return match &self.mode { @@ -654,6 +769,9 @@ impl FileDialog { false } + /// Validates the file name entered by the user. + /// + /// Returns None if the file name is valid. Otherwise returns an error message. fn validate_file_name_input(&self) -> Option { if self.file_name_input.is_empty() { return Some("The file name cannot be empty".to_string()); @@ -677,6 +795,8 @@ impl FileDialog { None } + /// Marks the given item as the selected directory item. + /// Also updates the file_name_input to the name of the selected item. fn select_item(&mut self, dir_entry: &DirectoryEntry) { self.selected_item = Some(dir_entry.clone()); @@ -686,6 +806,10 @@ impl FileDialog { } } + /// Loads the next directory in the directory_stack. + /// If directory_offset is 0 and there is no other directory to load, Ok() is returned and + /// nothing changes. + /// Otherwise, the result of the directory loading operation is returned. fn load_next_directory(&mut self) -> io::Result<()> { if self.directory_offset == 0 { // There is no next directory that can be loaded @@ -699,6 +823,9 @@ impl FileDialog { self.load_directory_content(path.as_path()) } + /// Loads the previous directory the user opened. + /// If there is no previous directory left, Ok() is returned and nothing changes. + /// Otherwise, the result of the directory loading operation is returned. fn load_previous_directory(&mut self) -> io::Result<()> { if self.directory_offset + 1 >= self.directory_stack.len() { // There is no previous directory that can be loaded @@ -712,6 +839,9 @@ impl FileDialog { self.load_directory_content(path.as_path()) } + /// Loads the parent directory of the currently open directory. + /// If the directory doesn't have a parent, Ok() is returned and nothing changes. + /// Otherwise, the result of the directory loading operation is returned. fn load_parent_directory(&mut self) -> io::Result<()> { if let Some(x) = self.current_directory() { if let Some(x) = x.to_path_buf().parent() { @@ -722,6 +852,9 @@ impl FileDialog { Ok(()) } + /// Reloads the currently open directory. + /// If no directory is currently open, Ok() will be returned. + /// Otherwise, the result of the directory loading operation is returned. fn reload_directory(&mut self) -> io::Result<()> { if let Some(x) = self.current_directory() { return self.load_directory_content(x.to_path_buf().as_path()); @@ -730,6 +863,9 @@ impl FileDialog { Ok(()) } + /// Loads the given directory and updates the `directory_stack`. + /// The function deletes all directories from the `directory_stack` that are currently + /// stored in the vector before the `directory_offset`. fn load_directory(&mut self, path: &Path) -> io::Result<()> { // Do not load the same directory again. // Use reload_directory if the content of the directory should be updated. @@ -758,6 +894,7 @@ impl FileDialog { self.load_directory_content(path) } + /// Loads the directory content of the given path. fn load_directory_content(&mut self, path: &Path) -> io::Result<()> { self.directory_error = None; From b98ac03000e0b3eba15a703b9932df9b0235548b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 21:25:45 +0100 Subject: [PATCH 105/124] Run rustfmt --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 4e2176fb..2dbf9a02 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,7 +40,7 @@ //! } //! } //! } -//! +//! //! impl eframe::App for MyApp { //! fn update(&mut self, ctx: &egui::Context) { //! if ui.button("Select file").clicked() { From c6d0db42e276acbb96d5585f0aa431292ffbed08 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 21:48:02 +0100 Subject: [PATCH 106/124] Document create_directory_dialog.rs --- src/create_directory_dialog.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/create_directory_dialog.rs b/src/create_directory_dialog.rs index 717b3285..589e3aa7 100644 --- a/src/create_directory_dialog.rs +++ b/src/create_directory_dialog.rs @@ -4,35 +4,48 @@ use std::path::{Path, PathBuf}; use crate::ui; pub struct CreateDirectoryResponse { + /// Contains the path to the directory that was created. directory: Option, } impl CreateDirectoryResponse { + /// Creates a new response object with the given directory. pub fn new(directory: &Path) -> Self { Self { directory: Some(directory.to_path_buf()), } } + /// Creates a new response with no directory set. pub fn new_empty() -> Self { Self { directory: None } } + /// Returns the directory that was created. + /// None is returned if no directory has been created yet. pub fn directory(&self) -> Option { self.directory.clone() } } +/// A dialog to create new folder. pub struct CreateDirectoryDialog { + /// If the dialog is currently open open: bool, + /// If the update method is called for the first time. + /// Used to initialize some stuff and scroll to the dialog. init: bool, + /// The directory that is currently open and where the folder is created. directory: Option, + /// Buffer to hold the data of the folder name input input: String, + /// This contains the error message if the folder name is invalid error: Option, } impl CreateDirectoryDialog { + /// Creates a new dialog with default values pub fn new() -> Self { Self { open: false, @@ -44,6 +57,7 @@ impl CreateDirectoryDialog { } } + /// Resets the dialog and opens it. pub fn open(&mut self, directory: PathBuf) { self.reset(); @@ -52,10 +66,13 @@ impl CreateDirectoryDialog { self.directory = Some(directory); } + /// Closes and resets the dialog. pub fn close(&mut self) { self.reset(); } + /// Main update function of the dialog. Should be called in every frame + /// in which the dialog is to be displayed. pub fn update(&mut self, ui: &mut egui::Ui) -> CreateDirectoryResponse { if !self.open { return CreateDirectoryResponse::new_empty(); @@ -97,10 +114,14 @@ impl CreateDirectoryDialog { result } + /// Returns if the dialog is currently open pub fn is_open(&self) -> bool { self.open } + /// Creates a new folder in the current directory. + /// The variable `input` is used as the folder name. + /// Might change the `error` variable when an error occurred creating the new folder. fn create_directory(&mut self) -> CreateDirectoryResponse { if let Some(mut dir) = self.directory.clone() { dir.push(self.input.as_str()); @@ -125,6 +146,8 @@ impl CreateDirectoryDialog { CreateDirectoryResponse::new_empty() } + /// Validates the folder name input. + /// Returns None if the name is valid. Otherwise returns the error message. fn validate_input(&mut self) -> Option { if self.input.is_empty() { return Some("Name of the folder can not be empty".to_string()); @@ -149,6 +172,8 @@ impl CreateDirectoryDialog { None } + /// Resets the dialog. + /// Configuration variables are not changed. fn reset(&mut self) { self.open = false; self.init = false; From fb57fbe93790e7e5f71beb3c9bd889ae17bcceb3 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 21:50:01 +0100 Subject: [PATCH 107/124] Update ui.rs --- src/ui.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ui.rs b/src/ui.rs index ec4ef758..173533ab 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,3 +1,5 @@ +/// Adds a dynamically sized button to the UI that can be enabled or disabled. +/// Returns true if the button is clicked. Otherwise None is returned. pub fn button_enabled_disabled(ui: &mut egui::Ui, text: &str, enabled: bool) -> bool { if !enabled { let button = egui::Button::new(text) @@ -12,6 +14,8 @@ pub fn button_enabled_disabled(ui: &mut egui::Ui, text: &str, enabled: bool) -> ui.add(egui::Button::new(text)).clicked() } +/// Adds a fixed sized button to the UI that can be enabled or disabled. +/// Returns true if the button is clicked. Otherwise None is returned. pub fn button_sized_enabled_disabled( ui: &mut egui::Ui, size: egui::Vec2, @@ -31,6 +35,7 @@ pub fn button_sized_enabled_disabled( ui.add_sized(size, egui::Button::new(text)).clicked() } +/// Returns the fill color of disabled buttons #[inline] fn get_disabled_fill_color(ui: &egui::Ui) -> egui::Color32 { let c = ui.style().visuals.widgets.noninteractive.bg_fill; From a6a10d92bf1577b72891e0baf017ccc2851b5c8d Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 21:58:55 +0100 Subject: [PATCH 108/124] Document directory_content.rs --- src/data/directory_content.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/data/directory_content.rs b/src/data/directory_content.rs index e999cc30..6f2d8773 100644 --- a/src/data/directory_content.rs +++ b/src/data/directory_content.rs @@ -1,6 +1,9 @@ use std::path::{Path, PathBuf}; use std::{fs, io}; +/// Contains the metadata of a directory item. +/// This struct is mainly there so that the metadata can be loaded once and not that +/// a request has to be sent to the OS every frame using, for example, `path.is_file()`. #[derive(Default, Clone, PartialEq, Eq)] pub struct DirectoryEntry { path: PathBuf, @@ -9,6 +12,7 @@ pub struct DirectoryEntry { } impl DirectoryEntry { + /// Creates a new directory entry from a path pub fn from_path(path: &Path) -> Self { Self { path: path.to_path_buf(), @@ -17,22 +21,31 @@ impl DirectoryEntry { } } + /// Returns true if the item is a directory. + /// False is returned if the item is a file or the path did not exist when the + /// DirectoryEntry object was created. pub fn is_dir(&self) -> bool { self.is_directory } + /// Returns true if the item is a file. + /// False is returned if the item is a directory or the path did not exist when the + /// DirectoryEntry object was created. pub fn is_file(&self) -> bool { !self.is_directory } + /// Returns true if the item is a system file. pub fn is_system_file(&self) -> bool { self.is_system_file } + /// Returns the path of the directory item. pub fn to_path_buf(&self) -> PathBuf { self.path.clone() } + /// Returns the file name of the directory item. pub fn file_name(&self) -> &str { self.path .file_name() @@ -41,31 +54,39 @@ impl DirectoryEntry { } } +/// Contains the content of a directory. #[derive(Default)] pub struct DirectoryContent { content: Vec, } impl DirectoryContent { + /// Create a new object with empty content pub fn new() -> Self { Self { content: vec![] } } + /// Create a new DirectoryContent object and loads the contents of the given path. + /// Use include_files to include or exclude files in the content list. pub fn from_path(path: &Path, include_files: bool) -> io::Result { Ok(Self { content: load_directory(path, include_files)?, }) } + /// Very simple wrapper methods of the contents .iter() method. + /// No trait is implemented since this is currently only used internal. pub fn iter(&self) -> std::slice::Iter<'_, DirectoryEntry> { self.content.iter() } + /// Pushes a new item to the content. pub fn push(&mut self, item: DirectoryEntry) { self.content.push(item); } } +/// Loads the contents of the given directory. fn load_directory(path: &Path, include_files: bool) -> io::Result> { let paths = fs::read_dir(path)?; From 66650e48051a9460ae08c7d87f86d70a075df801 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 22:03:32 +0100 Subject: [PATCH 109/124] Document disks.rs --- src/data/disks.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/data/disks.rs b/src/data/disks.rs index 4d6c0b61..b14d1d5d 100644 --- a/src/data/disks.rs +++ b/src/data/disks.rs @@ -1,5 +1,8 @@ use std::path::{Path, PathBuf}; +/// Wrapper above the sysinfo::Disk struct. +/// Used for helper functions and so that more flexibility is guaranteed in the future if +/// the names of the disks are generated dynamically. #[derive(Default, Clone, PartialEq, Eq)] pub struct Disk { mount_point: PathBuf, @@ -7,6 +10,7 @@ pub struct Disk { } impl Disk { + /// Create a new Disk object based on the data of a sysinfo::Disk. pub fn from_sysinfo_disk(disk: &sysinfo::Disk) -> Self { Self { mount_point: disk.mount_point().to_path_buf(), @@ -14,10 +18,12 @@ impl Disk { } } + /// Returns the mount point of the disk pub fn mount_point(&self) -> &Path { &self.mount_point } + /// Returns the display name of the disk pub fn display_name(&self) -> &str { &self.display_name } @@ -38,12 +44,14 @@ impl Disk { } } +/// Wrapper above the sysinfo::Disks struct #[derive(Default)] pub struct Disks { disks: Vec, } impl Disks { + /// Creates a new Disks object with a refreshed list of the system disks. pub fn new_with_refreshed_list() -> Self { let disks = sysinfo::Disks::new_with_refreshed_list(); @@ -55,6 +63,8 @@ impl Disks { Self { disks: result } } + /// Very simple wrapper method of the disks .iter() method. + /// No trait is implemented since this is currently only used internal. pub fn iter(&self) -> std::slice::Iter<'_, Disk> { self.disks.iter() } From eb8b341c994bb8e17a404a1b335af9ba8bb3ffb3 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 22:06:21 +0100 Subject: [PATCH 110/124] Document user_directories.rs --- src/data/user_directories.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/data/user_directories.rs b/src/data/user_directories.rs index d470e891..9e354c8d 100644 --- a/src/data/user_directories.rs +++ b/src/data/user_directories.rs @@ -1,6 +1,8 @@ use std::fs; use std::path::{Path, PathBuf}; +/// Wrapper above directories::UserDirs. +/// Currently only used to canonicalize the paths. #[derive(Default, Clone)] pub struct UserDirectories { home_dir: Option, @@ -14,6 +16,8 @@ pub struct UserDirectories { } impl UserDirectories { + /// Creates a new UserDirectories object. + /// Returns None if no valid home directory path could be retrieved from the operating system. pub fn new() -> Option { if let Some(dirs) = directories::UserDirs::new() { return Some(Self { @@ -59,6 +63,7 @@ impl UserDirectories { self.video_dir.as_deref() } + /// Canonicalizes the given paths. Returns None if an error occurred. fn canonicalize(path: Option<&Path>) -> Option { if let Some(path) = path { return match fs::canonicalize(path) { From e5d4aa9ca90d64e027ed3b86e75a50150373d8e8 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Thu, 1 Feb 2024 22:20:10 +0100 Subject: [PATCH 111/124] Fix test errors --- src/file_dialog.rs | 21 +++++++++++++-------- src/lib.rs | 11 ++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 2177e470..9fe95fb9 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -42,18 +42,23 @@ pub enum DialogState { /// The `FileDialog` instance can be used multiple times and for different actions. /// /// # Examples -/// ```rust +/// +/// ``` +/// use egui_file_dialog::FileDialog; +/// /// struct MyApp { /// file_dialog: FileDialog, /// } /// -/// fn update(&mut self ctx: &egui::Context, ui: &mut egui::Ui) { -/// if ui.button("Select a file").clicked { -/// self.file_dialog.select_file(); -/// } -/// -/// if let Some(path) = self.file_dialog.update(ctx).selected() { -/// println!("Selected file: {:?}", path); +/// impl MyApp { +/// fn update(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { +/// if ui.button("Select a file").clicked() { +/// self.file_dialog.select_file(); +/// } +/// +/// if let Some(path) = self.file_dialog.update(ctx).selected() { +/// println!("Selected file: {:?}", path); +/// } /// } /// } /// ``` diff --git a/src/lib.rs b/src/lib.rs index 2dbf9a02..ed303999 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,10 +22,7 @@ //! The following example shows of how you can use the file dialog to let the user select a file. \ //! See the full example at: //! -//! ```rust -//! use std::path::PathBuf; -//! -//! use eframe::egui; +//! ``` //! use egui_file_dialog::FileDialog; //! //! struct MyApp { @@ -33,7 +30,7 @@ //! } //! //! impl MyApp { -//! pub fn new(_cc: &eframe::CreationContext) -> Self { +//! pub fn new() -> Self { //! Self { //! // Create a new FileDialog instance //! file_dialog: FileDialog::new(), @@ -41,8 +38,8 @@ //! } //! } //! -//! impl eframe::App for MyApp { -//! fn update(&mut self, ctx: &egui::Context) { +//! impl MyApp { +//! fn update(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) { //! if ui.button("Select file").clicked() { //! // Open the file dialog to select a file //! self.file_dialog.select_file(); From 567f5c26aefedb408aa5dd4efe48e287d449c576 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 2 Feb 2024 19:48:25 +0100 Subject: [PATCH 112/124] Update Cargo.toml --- Cargo.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index bbb48e3d..e75975d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,8 +5,14 @@ members = [ [package] name = "egui-file-dialog" +description = "An easy-to-use file dialog for egui" version = "0.1.0" edition = "2021" +authors = ["fluxxcode"] +repository = "https://github.com/fluxxcode/egui-file-dialog" +homepage = "https://github.com/fluxxcode/egui-file-dialog" +readme = "README.md" +license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From b8706db228fcc1ae4d70f04a719fe2c60d8a4c83 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 2 Feb 2024 19:53:44 +0100 Subject: [PATCH 113/124] Remove unwrap --- src/file_dialog.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 9fe95fb9..8a77d073 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -824,8 +824,11 @@ impl FileDialog { self.directory_offset -= 1; // Copy path and load directory - let path = self.current_directory().unwrap().to_path_buf(); - self.load_directory_content(path.as_path()) + if let Some(path) = self.current_directory() { + return self.load_directory_content(path.to_path_buf().as_path()); + } + + Ok(()) } /// Loads the previous directory the user opened. @@ -840,8 +843,11 @@ impl FileDialog { self.directory_offset += 1; // Copy path and load directory - let path = self.current_directory().unwrap().to_path_buf(); - self.load_directory_content(path.as_path()) + if let Some(path) = self.current_directory() { + return self.load_directory_content(path.to_path_buf().as_path()); + } + + Ok(()) } /// Loads the parent directory of the currently open directory. From 0805609ce86f045f778017029debdab43dbceae5 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 2 Feb 2024 20:43:00 +0100 Subject: [PATCH 114/124] Improve API --- src/file_dialog.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 8a77d073..404130ca 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -97,6 +97,8 @@ pub struct FileDialog { /// The currently used window title. /// This changes depending on the mode the dialog is in. window_title: String, + /// The default size of the window. + default_window_size: egui::Vec2, /// The dialog that is shown when the user wants to create a new directory. create_directory_dialog: CreateDirectoryDialog, @@ -104,6 +106,8 @@ pub struct FileDialog { /// The item that the user currently selected. /// Can be a directory or a folder. selected_item: Option, + /// The default filename when opening the dialog in DialogMode::SaveFile mode. + default_file_name: String, /// Buffer for the input of the file name when the dialog is in "SaveFile" mode. file_name_input: String, /// This variables contains the error message if the file_name_input is invalid. @@ -141,10 +145,12 @@ impl FileDialog { directory_error: None, window_title: String::from("Select directory"), + default_window_size: egui::Vec2::new(650.0, 370.0), create_directory_dialog: CreateDirectoryDialog::new(), selected_item: None, + default_file_name: String::new(), file_name_input: String::new(), file_name_input_error: None, @@ -162,6 +168,18 @@ impl FileDialog { self } + /// Sets the default size of the window. + pub fn default_window_size(mut self, size: egui::Vec2) -> Self { + self.default_window_size = size; + self + } + + /// Sets the default file name when opening the dialog in DialogMode::SaveFile mode. + pub fn default_file_name(mut self, name: &str) -> Self { + self.default_file_name = name.to_string(); + self + } + /// Opens the file dialog in the given mode with the given options. /// This function resets the file dialog and takes care for the variables that need to be /// set when opening the file dialog. @@ -186,6 +204,10 @@ impl FileDialog { show_files = true; } + if mode == DialogMode::SaveFile { + self.file_name_input = self.default_file_name.clone(); + } + self.mode = mode; self.state = DialogState::Open; self.show_files = show_files; @@ -255,7 +277,7 @@ impl FileDialog { egui::Window::new(&self.window_title) .open(&mut is_open) - .default_size([650.0, 370.0]) + .default_size(self.default_window_size) .min_width(335.0) .min_height(200.0) .collapsible(false) From 5586dec45a81ee576516dd2546fe480486a3f494 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 2 Feb 2024 21:03:04 +0100 Subject: [PATCH 115/124] Add badges to README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index bd703c81..4d390f39 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ # egui-file-dialog +[![Latest version](https://img.shields.io/crates/v/egui-file-dialog.svg)](https://crates.io/crates/egui-file-dialog) +[![Documentation](https://docs.rs/egui-file-dialog/badge.svg)](https://docs.rs/egui-file-dialog) +[![CI](https://github.com/fluxxcode/egui-file-dialog/actions/workflows/rust.yml/badge.svg)](https://github.com/fluxxcode/egui-file-dialog/actions/workflows/rust.yml) +[![MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/fluxxcode/egui-file-dialog/blob/master/LICENSE) + This repository provides an easy-to-use file dialog (a.k.a. file explorer, file picker) for [egui](https://github.com/emilk/egui). This makes it possible to use a file dialog directly in the egui application without having to rely on the file explorer of the operating system. From ee76e7d3479b9b0f8f77b1a7a1c4ec1de69d5548 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Fri, 2 Feb 2024 21:03:40 +0100 Subject: [PATCH 116/124] Remove CI badge --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4d390f39..2ad338c9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # egui-file-dialog [![Latest version](https://img.shields.io/crates/v/egui-file-dialog.svg)](https://crates.io/crates/egui-file-dialog) [![Documentation](https://docs.rs/egui-file-dialog/badge.svg)](https://docs.rs/egui-file-dialog) -[![CI](https://github.com/fluxxcode/egui-file-dialog/actions/workflows/rust.yml/badge.svg)](https://github.com/fluxxcode/egui-file-dialog/actions/workflows/rust.yml) [![MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/fluxxcode/egui-file-dialog/blob/master/LICENSE) This repository provides an easy-to-use file dialog (a.k.a. file explorer, file picker) for [egui](https://github.com/emilk/egui). This makes it possible to use a file dialog directly in the egui application without having to rely on the file explorer of the operating system. From bdb113975893af196549f55553a6b54f5b99b39b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 12:45:08 +0100 Subject: [PATCH 117/124] Improve code documentation --- src/file_dialog.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 404130ca..4c07945c 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -121,14 +121,14 @@ pub struct FileDialog { } impl Default for FileDialog { - /// Creates a new `FileDialog` instance with default values. + /// Creates a new file dialog instance with default values. fn default() -> Self { Self::new() } } impl FileDialog { - /// Creates a new `FileDialog` instance with default values. + /// Creates a new file dialog instance with default values. pub fn new() -> Self { FileDialog { mode: DialogMode::SelectDirectory, @@ -161,8 +161,11 @@ impl FileDialog { /// Sets the first loaded directory when the dialog opens. /// If the path is a file, the file's parent directory is used. If the path then has no - /// parent directory or cannot be loaded, the user will receive an error that the - /// directory cannot be loaded. + /// parent directory or cannot be loaded, the user will receive an error. + /// However, the user directories and system disk allow the user to still select a file in + /// the event of an error. + /// + /// Relative and absolute paths are allowed, but absolute paths are recommended. pub fn initial_directory(mut self, directory: PathBuf) -> Self { self.initial_directory = directory.clone(); self @@ -174,7 +177,7 @@ impl FileDialog { self } - /// Sets the default file name when opening the dialog in DialogMode::SaveFile mode. + /// Sets the default file name when opening the dialog in `DialogMode::SaveFile` mode. pub fn default_file_name(mut self, name: &str) -> Self { self.default_file_name = name.to_string(); self @@ -184,9 +187,9 @@ impl FileDialog { /// This function resets the file dialog and takes care for the variables that need to be /// set when opening the file dialog. /// - /// Returns the result of the operation to load the initial_directory. + /// Returns the result of the operation to load the initial directory. /// - /// The show_files parameter will be ignored when mode == DialogMode::SelectFile. + /// The `show_files` parameter will be ignored when the mode equals `DialogMode::SelectFile`. pub fn open(&mut self, mode: DialogMode, mut show_files: bool) -> io::Result<()> { self.reset(); @@ -224,6 +227,8 @@ impl FileDialog { /// Shortcut function to open the file dialog to prompt the user to select a directory. /// If used, no files in the directories will be shown to the user. /// Use the `open()` method instead, if you still want to display files to the user. + /// This function resets the file dialog. Configuration variables such as + /// `initial_directory` are retained. /// /// The function ignores the result of the initial directory loading operation. pub fn select_directory(&mut self) { @@ -231,6 +236,8 @@ impl FileDialog { } /// Shortcut function to open the file dialog to prompt the user to select a file. + /// This function resets the file dialog. Configuration variables such as + /// `initial_directory` are retained. /// /// The function ignores the result of the initial directory loading operation. pub fn select_file(&mut self) { @@ -238,6 +245,8 @@ impl FileDialog { } /// Shortcut function to open the file dialog to prompt the user to save a file. + /// This function resets the file dialog. Configuration variables such as + /// `initial_directory` are retained. /// /// The function ignores the result of the initial directory loading operation. pub fn save_file(&mut self) { @@ -255,7 +264,7 @@ impl FileDialog { } /// Returns the directory or file that the user selected, or the target file - /// if the dialog mode is DialogMode::SaveFile. + /// if the dialog is in `DialogMode::SaveFile` mode. /// /// None is returned when the user has not yet selected an item. pub fn selected(&self) -> Option<&Path> { From 2ec1e005190ac026ef289bd0aaaa9ee3d8f0585b Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 14:16:24 +0100 Subject: [PATCH 118/124] Update UI of bottom panel --- src/file_dialog.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 4c07945c..88c68633 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -526,8 +526,8 @@ impl FileDialog { ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { let label = match &self.mode { - DialogMode::SelectDirectory | DialogMode::SelectFile => "Open", - DialogMode::SaveFile => "Save", + DialogMode::SelectDirectory | DialogMode::SelectFile => "🗀 Open", + DialogMode::SaveFile => "📥 Save", }; if ui::button_sized_enabled_disabled(ui, BUTTON_SIZE, label, self.is_selection_valid()) @@ -561,7 +561,7 @@ impl FileDialog { ui.add_space(ctx.style().spacing.item_spacing.y); if ui - .add_sized(BUTTON_SIZE, egui::Button::new("Abort")) + .add_sized(BUTTON_SIZE, egui::Button::new("🚫 Cancel")) .clicked() { self.cancel(); From faf62599775effe952de797abd29bf6bf4b87341 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 15:00:12 +0100 Subject: [PATCH 119/124] Update UI of top panel --- src/file_dialog.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 88c68633..dae67366 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -378,10 +378,12 @@ impl FileDialog { 1.0, ctx.style().visuals.window_stroke.color, )) - .inner_margin(egui::Margin::symmetric(4.0, 4.0)) + .inner_margin(egui::Margin{ left: 4.0, right: 8.0, top: 4.0, bottom: 4.0 }) .rounding(egui::Rounding::from(4.0)) .show(ui, |ui| { - // TODO: Enable scrolling with mouse wheel + ui.style_mut().always_scroll_the_only_direction = true; + ui.style_mut().spacing.scroll.bar_width = 8.0; + egui::ScrollArea::horizontal() .auto_shrink([false, false]) .stick_to_right(true) @@ -427,8 +429,6 @@ impl FileDialog { ui.label(">"); } - // TODO: Maybe use selectable_label instead of button? - // TODO: Write current directory (last item) in bold text if ui.button(file_name).clicked() { let _ = self.load_directory(path.as_path()); return; From 8792292c9dd687b13a30a1f43b8f807227279542 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 15:04:52 +0100 Subject: [PATCH 120/124] Update example screenshots --- doc/img/demo.png | Bin 39264 -> 41041 bytes examples/save_file/screenshot.png | Bin 40873 -> 41505 bytes examples/select_directory/screenshot.png | Bin 36181 -> 36146 bytes examples/select_file/screenshot.png | Bin 40652 -> 41398 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/img/demo.png b/doc/img/demo.png index 211a96bc8ac4fa845b941cdc1f26c788f9272556..8465cc743b8cc44f2f01ab503d46afe8c94b9498 100644 GIT binary patch literal 41041 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

b0mstC9 zBu)@brXBMIoXh^$E4! z!`qk({)$~zObfsEg7n_8wzXa4KDc`>zBbbE$U5;YIZS9#1nbt52iITc#=rmlBlGg@ z0Y{D;sb^gO4~&v39ml zG&LyI#Gknsms^Q@>NX^)!dr;0H3WGjD)i#C(IE;lG?Ssx^^55i;YpG)baoa(iH}cC ze)5k_4-TsBJn#>I-bq`eVkgC@VAhp(bAyZkldAz zXF78x0Ph(E2D*1Y&?3qRy1^qaFX;CVddmDD?UH|zpcFojzckNk?a^Gn5Z&&{!7xQw zE3G4Ho&>QXg#l1)jCJe|G5WmAAru8Sx`r)#iI1kOv z&V}!Gx6dAe>V@8N^u!4jJH5dlabRv;wz=dxc9dXY)6vOYyLK(|=4n<|QaAv-79DR& zfY~8Ag$X-79~dyya_HL&`1N_Br!1&e`S0SmgJ(Wuo4ZiVuzE`8NC=t-+!VL@Vupc% z0Y&o^I~$v5C?ff}J#Z5KwCAd~Z~hdyI?V<(pFo*|@sav#t1Ck%|2~2H6L`25sC8(O z&>QSa*xA|1ckaCPHSiey1RgUrio24Mzf@ipSi|kvKUXiY1`q-T?(~vai~yCuQ$RlS zy^H4NCly3jxIywhcikph!quw>aRI&k{ZqXG3O{OV@2Mrny?S+@Xs)0($_l~{8jQF6 zLIJ#KU@-NMQvkIF!aaUX+(z~9&F(hB7t-cf#7Rj>#WW5Z85=9jd=d5r`eyAPPTrR{`%8Dgphho(Bgk@ZVTY zpQgGCh4SR}ob$G}wvmr_6vLqMmX99}@F*Dny!}sWRy7kVzQSvbQ6?cf8LM$(Dsn9h z?iq{Pl`G{l!;MZe_dyLn`-F9|IRCVLq=o|qxNz{`!EceGk#vH#(}Pa&`%YXr41)>f zg9KX2^-@z_Wi72#3Tg(1u?eg$tBLLleh0){T!eW;eTIgNEv>AY3tR;8zIxp$MM!dz z`3N}xs~pd3e!5Npdx+$X=12efdKDK(^fj;%j2UR$+dshoOE#TW1PZjZoxLuqdJaqCKzT^8Ayv0LHpT-&cV5(1 z*myRCNy^tga7*h4Gg@phP&urPuO?~vq@RFh%FD}tfqw7Vw-5azP>&?Sc~XWb9e3_< zk$^VA3_;5_GBw@&%ZIN6azH?2q+h$a0X_^^XVcRcFJ#b{`@e@X0a7rm3`hZg9`E0e zl|9N6!%Nk2FhJJn4|mSzR}FIAA~y{a*%DI2?uN!(y8AtvQAWy0T z2eyi7XwcvivpQXA?}8UhRcf#LLlA^aXk=m04~%^_{Ch|IVN@|s2G@|zl~FrX{7vmL zhM2x$h7xWl2Ju5TWVBOoZKw7_Kv`yU?5=DT`jz7y^Y%Xi@dR&uytEzP|_b8PJ~ z(An;%>{;saRbQ4Q#kM}6=KFW~`|j=yT_V6r4UB2v`#~2jKos~IR!0xbF{DZ#j+L~m zYUv_@e&k#6) z#n^U6l7l>Gvr583w{UcaQL?DSNbrjniQZZ*ro84Ic@<7$`SC*yX0SFdMT&$6v8zum z4yR>U^~<9>c%Hth_2yq$01CS92m7@?b=_7}Qo4`Y%peQE?3mxdq|Z$gwDUmy4$|Vg zt)1I&uXedy;nV`hxC0qPGW<6;YbkrzD5|GZvXEZ~GQ>ZJ&fX@u3ylD6_yxb!>!kiQ zIJ``3Y@X1QSZt>UF2BpjXnt=*4Wc48_x>JwNSp#z2p~4xkWKBGb^71KWQ>dwe-H}i zU2HGn->+VMVVQ?Lb0_U!=ChijOOJeihwqQjleOmF&LG|8wz8@a*ifI4J2Siz%s17u zw%o)t+t%&rMNZk%NkKp9^~9-BF+kD6N}P^@%%Wg{)jW$fUrPbbNUq(Onp$lm{7;Bj zDA<>roCHyhue|Dpv1 zlX}Ju$6=1{?wt6o(|m4I<6XsvM4UrV1Mpt4Y&PkjDWF*Eoqmy!nyU68aAi=zE$Prw z1zY4%QMdUnPn21py^^?#!6frA%At21z$S?YuSE%rD{L_C%b)9DVqtjz=6kFfaJM_6 ze~OvgYLR>OM%D34Nu|sI;t~%15BldjBVE2Xma@>BG4;haO!6s+6xC;6p=oJp3Z2^- zltn{g?=q+y5_4ptaX2x@B{YU5?oEiO-+0tvb8hbO)?%rF#o>)XB<}Y(6hzKV#vV1M z37u~b)~-G6(VF{tZg#Z2vLoNAp^I^tb3r9JVIVhZ2vUH{<8I2>oE#0h&x6)VO5H0f z9nH;&f%b%fF=`_cNxkSEuRbj!=H#)3^qouJHXHjA*M)A$*I!C4-^Y5K^mNxYZ;@6p zock`ozW-ayxCYC|xVYGolJVK8>O0AqK^C0PxtO@_F{C&yx_!?u+LXS#>kz-&J+G&S zI~=$o%zAaE976Xws3?tx2}T0HR+4iGQ0j^&y=?MVFf?G_|(L!GGZH2JKh+` zT6cCY#HltM*tw>BGCn7LcZ~L2&)~#_$7a&;qMwDTEi(e5N_u+7^3)Pb@J#@lm2L;hAxY< z4cxpF+8;Z|i{sUQ{HQ&5Mdz@=N$sw}YR8{ehc5M{kj}a+ajd=7-sT?@5PhdBzK+Z7>&=sm?Xh>fcvzOs2p%K% ztducQ?Nk!fHKZz7w6obd(80C!K&_J;af8&_P{^SYKrg%1!W6aqXX;r^`tREU{MWhi zu8ptoi+aC&y8a||2fo~r|0mf~2)br$IMVS&(TjdEg1FQ3ZjvLm&N^lX%~SR{z5Ua7 zQq1C`oQ~NG0io0n=IydKZ_X`cWM&d*^;vkh51gEtyxhFMSVe)3h*hz^M_+O`mL*R* zR+>Vasr)!Mx?A0%FW>w#UFneEq#hh`ihcgcy1Zv;+gYtw`P zbhXeGI`^N;sp+mOjuiAlPj54a&TSYX=8$w~XM{5b^d zVxprrcov_NmzSU0au2~DP`q@M6 z%F_RWL2WSoAEA(;&wlyxMNp%}8am_-QuoR1f&wjvu&}T<-|R-Z`uiKlrrmK7eIN2Q zr?YkjT8G;M><#K=+x$4eb8ICM84}WZ;S2dZr4eWNyy@l#?Av$ zq0VacLFy4zr9IbK8xUiEPP6Q2biML$jLS5S*f55cvky4&W^nQ>%FWdKDmd!e|QwUvkmq zE=v5INDYB{!YoAz!P4KhZCkx3QAvB`fnnNegkQmvA}%a3QKsFZX?22O?HN*0<$A@A z7Fw6$SPF{bbf`E-STz)&yWqN;-~EoNx;Sd^~}em>75P zu%mZ?9gU5T<7FeT=G11(kos@nrOY?O&d7K#D(WzJq(|!rl4#_>jy5)#N?!?{ecE2*_D50QRXND>gIXLVg0x>o^KH1dZ^Cxjb zB5+h%8k?Y?Qu*FYRcc(l+8G`NCJcLNXxs~K zTY`jpQflg~z4OW<*3vSHxYwiJ)G+F#)R87_m(rpk77@a_*2)Wk6%u8Uf8jv3`AvnL z>BpNF;=E#Yb3^DE=U7y=2=okvC;Kbe^TN<=qU`o1Y>#5shwJHHU0X{ zn;q^&pJ0UsH9@>i*GNH8ezdmaw#Lb4-ljOjG5becSyS^H{9I`Th4}33D~Yr(!ozo3 zHyZqDR^viI6`3(h5S@Q?sn3FuEYYG16$(Q1V@>Is&;ZaAM1jbc=;Tyr-+bs1o7vk4 z*Ig&S1kVXZNEsHU{o2ahQvJ0y;(^#O?Ihhq&=#mVs1Q~QleY>MhuHm0hz%m{Rp6|~ z_CBjW(k%jT{ z(o8X{PPxH8@Bbo@Q4044a=HNKX)Tu05vjlGWp@We5=Zr)qnri;c%*gr@K^m%q2g$`ivXFT^f(2V{6(9vO_ML#W z6g;xT z6gf8okXe^Sf{A|4g0O107yZ}4;iEvC!G89P<~M;8Ln#FX^zch z$RGC|AfC?=fBxw1R75uR=~qVx54c_XV0xKhsNort6x{yDlk@*U8lm31w-i+$vNs8_ zJ&}!zZm?aWChS7nT)Kgd+GHqk%gfF?NH+m1Xheo*MXi}^;O67ALa6toR$e&_T)-z~ zUm0oXD5wlbu0n){*!DjmL&{tnv7pGMBq2;8r1n=;LDCJ)5uYQClpqOmig+61-v!4I z5Z=%PY3l0Lt9$nECmz^)4Gx6k08pr?sBpCiTOcS9bXf`c9|(%jvmlRkIE@J-3LO}p zO`7`?nu?Gl7lNHHxbz;ri)rL^o!HJ&5e6F*j|@s4v^0LF**BIV>rXCVy;Z|?qM%R% zkRg(Cd5?X3R6jhElb3&;o?grJC^ zJfexiSv{rK<6>eY=q8O5RsiTwmC17aE_d?s(fC|RQA6Fv{vu*H-@^C$M~?T3RO7SI&}7pofjyh9vqOY~767e5$d^DN2z~&lIsFl; zy@m_KgF#d>DRh0gl=f%!5UI;EaKF*G?~d}DBKZ;f?wwLYUG5{r)>^oYU0a|H$5T8x zw}Xd#hL^3r>-IS0k#0;y49~p(@Zp`)ocXQ2E{Fp(H#ZaI_QMBWBsh*j;}5kc*zl`9 zQ5hka#|U))V>lqd67%kzW%*bcRx@zxcMI34P}j7*sGa~J->Y3`&wzg*TM#B-^BBJ( zvbJm$;WB#_HQu+lO9u%+7zh7d--%szTF3jxBS-0QFK!HI+ptG0@@Mvuj1?@Mgi`c- zvad3!qa**nK*mfa-PoKDNeB~oXnDC`bnYmB21poGNV1fXtx=7`L{Ju{ zDPTSHWq9rS00q!QrTF`yukhQCgBfrLE&a(L3LoTnOenx~W&t{e?+uH!snD%Z$+zq; z*}BzL5g+NAQe7V0XRiNi={qoKL^>$h*8V!|ZDsE)NS8*J>x=@)0Me(yl)E^oHQM7C9I z<_H8pOf;ydsr_hbI%-2tpo2Tw6U||SRNLXU=F&F->&XFOvF3ayKE&~r(jtoa!diS` z;^eK&w$fY8*0TpSfCGR6Zpg7{Em)qcTwbVlBhBfLgWdGMlA-S#hA#-n?(Oid3>zS?bpPaaC=(RFdj zpFGRYf3>+X&oeSoyYSjY$K?IZ5<@~nH|%yj%_=j1=r|t4Z|KRYd_LuhCW0C%YRk)u z1?Ph+<4m*89`G#gy6hOwwy@=Gvnj0ffVmDQg-1I}uH~203)|46-F*iSc37EdZ2o8! zpA)*?@r7>~zG&J?r18+TU?qsFsXfneD0!&dnhpUJ)(sMe4NH6A$pUX8(>>)yscvL+ z?AfztsC~-q+zAmJ2O46(#}FSjO6KB8E+u1Y%ZvCC30eh;u!``*-|{Ac^a9pi`?Z~S zKPkO08PkQA4JG+*TH)%;owU4f5z|0-K}M>{ip#{rgx`7o6jBGTG2DR7gig=kIv<^5 z!ob49vOMl78k?UV4p9KKI_{sZr4?bXt#92#DfEdwE$=fSD$3>I)w%zy%&Tkh1w%Kg zdyRKo1gH?0t(Au29fT5uUFezFMhxVeRDNZhE$L&j-JCf_$cVWWIyo6<>MQ2iUxpLaX<& zlHU=%tZumez&`=k%=z?3ILS8~ijBktYjsbQF{pcb5|c=Coo)W0IY! zT^Iq0=BUfhH0|mlcQSO48+~7cVqd>TSwD94=wX03n6TTnZ@-7=Iy`GuMn;1C0}8-0 zR{zd|uiZ*mVERyDRz?LHuEDY)I=8Uy>gww9gr8e)gSs}$@#94OCWf1&rMD7zY^Xj_ zY%VDuean$Kng}fttP}a0n>TNc69yj^s!m2TiO`}&>xZ2P!$F+E=e=7=!q;^n*xsG` zs=+vDcO{WXve^nQ_jgF`R`a`C%Y|!mYxdob*ocluL^H^_GGQ7214A0Cc7mWj^7Z`< zvExghWnw5%J|@)PosxlsuKqQpW@TZiMKK~@_XO7;$X{IX^_pnPhouqMzOQ>xa_#$q)CrmmQxD-V7IK@9 znzGuN_*6tyi^>?>F6rtX!Dh*k%55+%tyVBUMbupPiPhkrQbaUVbZts>>c>USokm)n z=QH4(+6?%bHod(EO-_++-zLR0`!PQOa@EeyqK?x?p=Du&XH$E{Erk>X2m&zaFtUIXbzmlt5$Nk$ zBjA1w)zAUV#HOaocmP6%JC1At8UMq+KCga~9H4 zRnG*N*L-ue>+jveRpwb!lxyRZUweqbCSb6DmoH^8zJdmhR}JM+0ZR;CBU~c{p0<2a za9dRFYYGcH1j+0(CLH19{{owoU9YA&(9mCEL=k0ZqjhlZ2HZtdPR>h&$vUntscLKc zRq4mz-ywn$s0M$w@XMW&1Zeur)eKTl9n3}Ic3*w?@EmDhWh7N0qL2WBV|GSSQSol; zh<=4X3syFgr&V}bNKY0Sa{s8WFF|RIW~RxXvE#UF5aIBUjNTp-u@%@w7!up`N$1pC z#B>o5gP%;l{YG9x#2%NC_S|3y3`xZz2#Fr!;86Aa2rV|Ud)^o@8PcZB72>_S^-b|d zL$J$R97-0NYqKKeAMb)0-a(8P!8V8AFARvrt|GOw>i+}D33NyxqJvm&U%LY^)rW81 zQ2y;(?0;uCFB@HomU8!r;ZelPhj#;26W9=?rZ2?9V>99z(0&gi6adKZf4I`eGuhVF zfKgQuI`VL++SQ_KLfD=pP&+~BFa7OV$W1(b`BI?w+8bkHw(iuaT?6z+J_wOrg)#0y{w&N`AO2pN7onpii;%*VGMBou`h0wFzU5nj;IM!Erw zrP-0G1ErVbVL>17Bi}1(9 zG%Msp^g0CJM_l)xwXwBDf9QGUL1E2-$90i2zXWMZI3Qo!8Zo2jnidccAc5!%fq*gX z<~-YM@UGIAXg#AwBKdTk=$M7em4&wvmjqKN|N2!IIvFx>7<`MFRvw!WR(bK_#k#TH zsPzAf8qFMI)JwtQ5#cWzw6?_4j&K^~N17tPpW55z0!N?9>|DaV*V$>gUNpc7jE6UMU3cT zpk^Wh+n~cBbe4{+}W2 zK>h=wA!cWg@2YZJE^~Ve9Jqm6@h%1fkQv1_cvJnSAdge~=IC`H>IgyiHNC_5xM zS-Ko2PHfJxs7lkye~D@ZCIOKuOw^4Y43LQFST|aOXIT8p{`y|{-|R1;sU7+m2lKV6 zF{nE~S;@&o;{%mLt@*()oG#T5Dc3(*vOr5lQvwYa`rt+c5l4B5`}~Sb{Nf*-KDmD& z7G}c*!sQb$LtN8jdC`VA4@x>DBxE&%I8^?UBogHRFb*o@yNMWE(RN$mAxI(Sa-1NH2ccgBWqaZR}Rme}SShs25wo@Zo=`f}0B=c9k@Peq?v?%LS&_`(>L%O;_3 zc+DbNe_yGtn5utmquQG3-yfUuf!{&bRHH5=B%y>|_P(VL#bKHabg4{Hr#_uJ^KFch zzTj5Dj{PZm=S9;puRIwu7#mylHR)np=acp)X_l}|4USggC2^8c= zGN31bRUzy3H3Sc#q)OUfk?R$zEp}{um#d?}{svb0Ffe63#0=YP8n0vP|40`8>xV%W zXdK(M3E?fc?3ThRr~g=fghO-JGW_Ms$69Fy5ClmMiMocVYr6yiiUS3Kx$W7rXUFh3 zDY1}aAyj!EMP}cdURZ-}G@ek2#FHB)A>x4P67eGLmRD=@O)x+a)!)Bz`h;R=ze0tFgidp#~#BBwWBcrGoP2(S>G z>1KDyqoLQsx`4rLcgpDQ)_Wc@su%1a>t-jXqrgydQ@Y*@0h^>8ayUChI*O^n^pwD& z2hZqF5AwW)dJdiHqO9!W9GS~nTJqp`7%5ZcBQ`c)P?y|-rUaT6+)lidM>ytz(`{k< zz9+Yu49Z0@^>+bG;sLG(!cJ^VY2gQ3<>!Zl?A^aF@;kMKY z9|}3wqsNbT7gLJDei~n%s@6lQql zwh(>RhcSYn4iGbYKYsjxX#k-TETtifur~ODhFxu!F_3#D(>Tboy{UMFC4 zRdQYKVL&eU6K>!lW~%D1KkO?LUFE`j+pk|m?rpA1BeF*HcUCkz zn5nl%+$X3Rky}B-{4bdJ#?b)MsOE65kV|J@S^Vj_W9wF(+E*7a1BE+k%C+Of$bhW& zL_;gYU7SIo?wQ8#S0+Jd?A{H=s-8$;20nkDRO~Kb_1jwj-j+?_tEKf#Hk6Y_?(^hH zFkTq5rpf2^ngNg6gy(ce|o}6kANjTIv+v7)jd)3ldA*Gn1VM3C+ z8_cTGuG>d5l!FFI5v^{~i?WUh5rt3$gBo?nAnlZ=T7+W_OtCPL{ zX$N0dDJ7*3KcIcD6;rBv<68(9#yzV{ z44${(S$JUvi-Tk5Kyz)7zrSTEtvregs$|Ww0JY<H zH~d`B)0dQ=QVCZq1SFUzj%NYTvZ6gsJ~RCCZ^oX{89u%jqP@2*5;u1WfB+_(?^quwvwM4_rp4 zuwUp4&j0ELQF%_#N|=p}EVq4hFEObC(VJ{ z69%$cavyx@o9I!*Am%1Ais_4v(ftFBghSikuuPm{@;8@{SnfF7_=Hj7zRj8kxN-EYOj?Bqzhy7_@xPnZyHDmbCG;)BBPWVlZw}Qw5Gcr<&o~2uP+L*1Qc%nBEDmq#~ z52nM;;arWnK|Fb}YLn&2wdMY7&67Y4gsp-_MS>s+M*0?TT1vb(6o6`|lMAz1g%~EF zg)j;4h{&SG5ow+~$y2S(6P;_Tb3s!@WRS54We+{EvtI6Tqn1;Owpkgv=jwc!s3p$q zVQ0BRI!WZ7BUkiQLhUZ5MmdxWm^t`(81Znm0uU={AEzG0_5-XcbFr)|P7MXPDfghEE zYx^uOtEyhW6f+93tXz2k+Lk;NND@NR1HZtu-+dw~WMB$B4h)J3SskdKBv2urMnuR% zyrOQ zozYgom8JJKkp&K;$3R#BxYj|BOn9MwQ5XYGTG>9#%qbzZ+Xmpo+`-vm_o;*ND zjKoABGB=)T$*MyC>n%^$vDu8)&h>YS>1YUr<(3`iu;7 z@6AKRHGAC{H(6Jz;Chj7->!#Rp=EaN+&OO=p0Dh`E5$PDmU8@aywx?Re;|g2WecsU zL5{?gFN06{Xls0!8G-Ajk7{96JoRN%6=D`jB11HmBS((M4 zz#swv5&uGaEVwRWE}=-fClWRzK7_J3R3vX3y`NNboX9S;OyZ=Fv?d*!gE(M-ka8ef zV)a9H6fl&N&P47AmSfqOY9aS_bL5V6GBujPbD%C^s(Ytr@jax8-o90ISx+^1j2Bth zh=VCVZZ@U2-k*o$4kxF@Cn`R5L+7rfNHW@q6AS- zI4Uh@13a>y5u^TBH`X+wqY{=_{f$BbKY1<^XSy|~>v{f7{adf|fU%+tNX^T>$<7V| zJ{8G7yxyTwHQn&L(0p*T*aFS~D05rwciSk;qi?~C`DL^u;@fb37}qNRKB$B#MChsC z#*CW=$08`FR)-6c5mQj~e({|LFi%=W@8pf-KFm}G=kX0djU+_F$4@ZW0IE)e7@vW)#DzZK^vrt?K$pP-be4BG7LZdiy%e!^tHNpn~fF$T5SJHL2)F`|0vauP| zR1@Jwh)ifPI9TBpvHH3t*-XSsz23q0ff&Nut8Q_GPZJgb1ZJ!55^}^Bu6(qN`@swP zid&FF;E|g360!d<8n1|K4iq24QCphfIDY&H5H=j>d&m>S<*Oq`il8gna5_#JQ&Lvm zfTJ@oF-PomghNk_8&sB;9~Kr4|C>T36IQ)M0K(exOMnD_^9@6{Mf1-*D1P=I$sm%1 z_(0-ZGO_BeEyU0mk>uGx%%dZ(mT+3Fv%r&*;WwG+{03xM#^xU9k9pt1y(_=IM4Y*1 z`4KX?S_|otDHJ=974UdcAyZ-;C;KuE@sSKfUzGHtPobErtF4Wu*m;zZ@!VCD7VPAj z{^T_xs&(kl8%;iLZu{%WP&nx^xw*FvK@aVMFpw{FH!K(t?dIZNksN}8v;h?*u#3=! zh*1;1HX0%Zt$UaN4{`bV*XbsWvR6nTP=I`ywq;*#ulK9$n-sWS*=IRpG{T7tO zZ7>aBGAm4?-CAi4!rju0FE4<<-TD3PpnTZbXmctil}@@b_mBR}c(Z}n6#)nWVLBvd z;W5~JACD_MdfWgUmhxnUD_0H#b85fN%xqw%5T2vmL5fv-Dz91%gcK_pBT<3t!*1C( z7FfuAyu5x9M}%mYRTr?u*ENsrSoriQLdr>qo=De5$_!Xl3ztDJle~QSnffwJvm*im zFA4qsAFTKQrw}^LYzR4ZVpt&9$CQhk1uM4$?9=5u92X655DqF)C=i$W;vP zU8_)VB_f@X&XeRAl@dg6(i+JpNG`F>5WB{ilG^FX!h)`l1<=}nCefcGku^}KqeoDj z3Mp~Sb%D7Px!+!hv|BJ$j1!K&40p!=3pGGQl9rceg`5fcbn7?uVc3{Z&EX{GX{{_R znz9Cv=WF>j7{}rCheree*UpUo?mJg`>F6iG_Vw6uJ_z|kgz@G=Sw@0_gZouiNe>GM z&>*G{4}cu?N9`E6LMW6y?Un@)cAOca?f?~NtoN(*i9^CFJOh1Tqb*DRN(nYHf+ODZWyn=DMOqn$K^C@3e-d@1`~_W zGH34p7q#_2@v=%^h`u^1b00M|^&_0WgYyh8Ki@$lp%5Cwk(Y54G1*6mRQ>w&aF=_h zKOvoiZK1D!T`VjB(Z%Sqdx0<6S<7B8%b`mU3ZN4N%9#BdN|d4&q%A>-k-2zrlcTL=qRHv! z!NCEL*|Yzj-o896=e^yxuo5dn5h5j0N@$X#fuuoEMDrj@DVo!uafw2MRFYJZgeGa8 zqcl%wkY>$AX)aCY^L<)t?e|@KpL6Yf&UKylAJ_F->3M#`{k`wcbX#-=Jfd_K=?=~z ztHi*3qUz!|;CBJC|8(HWx$^RI(!jqnPC2Wqn_x=gV9ZN$A^$n^uGLui>2gvc`~hJ| zA_BF)YTY^{&6-05`l^5kJ!m^PontoqGFzN9qk@Ii0w&M%zF`cfa|G@!Ld$&Y{Q1Dw z#dQK9m54vQh-Tu-l@a5y^Ct8TWrD$#mtnbXKR>NA!27HC?{WBNVC||O0|PrzCeSV8 ztKf>N*itK%v8*{?)_)Q&NzC!px+$Bep>(aDcyZR_47rrwzK+Q=;PaIe5AhOzCrO*{ zi`HYymD=+Rzck?Cvu(CmYBM}z*x_{DO-Mb!2gkP)=>UNTVR|0A&h*jw%M;B7`DzoDeDux8@)abQv+7{@r?lnVA5s3l6-Vs?eCip`0llXhQ;-J~x@=Xe=&}yOpGShA zU_w@`i|I{1fWik@GC&`wNhct-Q>UP!Na2%~mK)NKVHT1LV zz^nWiGhfyhd;(sR0bXJi{tLRkNGd{^X#Zao!Qh`rwvH3!e%*;BxHxGPMgrZJ!E(fJ zQqRM2>Tx0Fr`k#?(Ba@(3qZwZ`!Frvvu~dPTpFM^?LI{G+PJ_*fhXcLAn+yQ9#~aYZAg)kLue2*FKt*Kwx)}7|Zywka${>No+1$GdKbJ z^lMfM+J9CM2HfTCBX%J1*&xS+LBd9YEgm!Z9@o7K>HwjL-xlpCLLGXE;>#o9QR7v> zlF%vRP6&;kg>Zt4t~04K1FslFOGz zy~rh%wy?76@nu_l3Vl?Rqt&HCaQ7oC0?+U{F%L7`6#|0+n_pwMks=p!-=ZFWg<&gH zouK0ShlU8et$;{2Aa4r`Q+ddkcr_%>1D;+VV(JI3OYe~seq?pcr%#fIu>gK>Ab0u? z7@o$UqaZRSFhGAg_@4*~)T(QWVrD&`68Fb|huj3(k-GFAfe2&#cbou?U4hkLBKnePvzH(feE4XdHABJ>1=YRtQw@`GN2rh($@@E(Dqd zkN7T;jERlW@O zE_0~gHDy4VMaS;$Q+wkIJ!dE6WEkTx-Ma3Uf4Cm;U_dI7tAoPm(bLnz)&yot?&Qh$ zog+$WYA?Mgv~a|X*s4>|ygOe(g2u<@<_cf|=W`rT^N|mJ8;ByBWZk!ob#*6>9(7fX zJ%kJ4f`l(Hs?GMjp^hNa^>LR6_Fr_zq{Ti3GK!2@-$+nIJ(UAV-EI zGa?Xd3xw{_V36`j)ZDOpkGftXF>*NeV5dU*#@&LBpAHYnn?Tdsa4-T#?aIqZ!Nm6O z3T7NPkvCZ3b(q-cFi|<^xlq9!M?P#Wqccu`6A6C{{l@s+bqDv4^ZX9o(9wj3n2%01&UzhwR>J(g{EonI_4v{ z@v!rpU7HMrg{N(>b}e|-|Cbhk1G!5iIQVI=jUBx4P-mAp7b;87Gs$U5e_NC1@3--3f_bnR@#K&9|R*biqYz6o@>UdHG69{dO5 z+ZrCJ1Gp3N1mv)K7I(6VifRQ%sFEZ(>BuwNX%-q&fvhWVY(S0)G2UxuUDvi@;>Y{& zO~v|@e+_Yxl_^|8SNb|d2DA}A23l`CJ75OKjN5>nG#t#w(DTZ%?MB{5qvv?$k&%{= z?$C_(gn$T;fuJ6uCde_#dx;jrZH^g&Xi^j|K*XQ`91TQ#fMYfS<8pDMG1&Ioebk*sp;?}^r^M2LW-s8{v_ucDV))!WxA{gv3}uB6Ku zX=;Wv*Z^k)&PHUz&~ihE1Z?AI_4ghkL4z0YK;_ z>e>#%mAgLe@7M8i`L7xMyz2ZUMxZKyh-?TF8%@Fl=RIT}Ntl zxXZ#}oc8E_EP6w2AHaT^yzWHg$NTs1=L3aJFwNwMpO_|~=FXje5Pzj_alr;f(RVm# zNaWAcAxbdw(!a>aNcJV*VcQ9S5>3>?{4CKqOZ@ui3z*@LUz@_we9EKzAe#x?Es4rU zU58R=%%Ls;MDO>+Voz`H50{fhV0Nm3a|B!@Rs;l`-G$rfhB=p8&aiES1pNP1EHRc> zJ+0PybAj5QQxTbE%ID5W!9a@hbo_D0JUAmLKYT3rQR+UZha&V$?BLJweJSRE;$o|* z7Tdi)P$@5=)Z$|z5RSrwKcupO9QZ$nKC2?NCDFqeR~ry^7m6i>(vT90T!Xw9k7 z&|k*w168%B6DfUD+ZMrE?)n>n3!Hd;Q!FVe>K4315J{>bK@^IKvh*B~O~PG+H^^h+ zsd=aEvLqo?fh>{}4i|`MZb3jVg9?Bzq>@S@Of(qEz}z$kl81yYB734<6U5k`tnh;! zl+l?iOn?{wBgx8qgf!Vt)T!b>@5Xb`49Ek36B+^&t5U(kVUusT ztgEZ5W-oR)a4EmIkf;{$1(7`^cob(~C`nifQ82XuD2zb!b@?yPM1lk);pnhPLp@QB z^9&t_&OD7JB!loLcw$}2fArlg#8VC^6Gx`{oh6wF84IAVLt_F#0Y*;M>#0-QCH@KQ z-4s`j{75w1Q2LG7iGq*45qe|+fm>EUCdY#E<_x}sgppg!X8IdG8@z^8FxlfU-y;xi zOd`bY2LWS%0m>awq;YX;kkmc2Y&^j6bwYw63c~=$)82_iw4bNYZXxYmM<6t(GYys= zL>a@@gwLmMU~uN#Il*>;Uhokgjr56`I5m|!VUc<$d+apEAkw+urR}#0npPcOh=7Sc zz7PV-+0c$Ke}AC&Q+Fw4qNpQ{JvlRTD?-9?BGfBRc8}Qg4Gq0WO;u@mj?Nj^0VCW` zJ5lueXbH&n3L+@pYeC{@$XXI$CNMuaN%#Bt`xlVZWRcKp7$DMHhMYU6xWPAIk|Z&_ zHHNou-Linq5|eVET7sEl=QgBthTtTB9a5Nwi~;U#6~FKS$1;WfWON;`iD-h@hw~cr z1_W+1(E5<1BS$ll0lOx`ep-)HdHd%^5fOy@-UkzHhj_UT5kPDh#+|^;Phy&;##SLW%H{4kh zal9eP3^blJ|-w>b@vzv!U0pcuZy$413`QNs^5THtH zA`)f1lz5HbV7ml{M*Pq=^UuNM-QOUw`>h?qt-1D<5*LtsjbY_@KS|p6d^fXiRZHTf zmC%4l#ni2Rbk#wW1yDA8*wHofNd1NGaVoe5pi|88yB)Fbn2qK@*EkRUeq+YrMRDiI zjDy-V^3YbI5r?gjtT)M=OzDqJO8OkLZoGLj0#Gr%tZcEaC!`P>)Fn$a4PJ(E(509= z&TeN(g$@l8QoMpenf;G{PEEg;KuM@$3$LBWquKP<;GQb0D;jk^1n@cjHr*d6>;Nit7i9+^?&Yw)TqB`s>P{TBo3Tqd6!jCpvB(O}h`TC&0g z3S@im|G)PWpKEHKt`*RGzXCV9wqvglX+uf{kdkbHS@TQIjkHWTI^}3K>fXM@rMo%D z^YX_|wp4DL>BnGQ|NFhg9Nz-)w`r&Vai*_E%R6wHPhnrFRidKolFZd2)LmQng#HIU zn`zyi26jQXY0y#v)sg~<0NQtcc8cV;JC8@Q^5OGN>=Um>MFt0+O=2^S>bV5=fyk&IRONP(F!X=`_u|e7IPwt5 zaV$LJKaqe0LxZV!&#Jz>mrmL0l>HNhHnrld--Fm|L54yd1dB2Tw$blN)eKnHfg>g^ zIsAyN&zVSRMDsQG?r(!Di0nSVhyt}W%nJZ;-XRYf)2VbMHHqEDVU9N87+QPiLsx(@ zc#JlP0gDp6HgDhFVm1d=o-g{rB@?7deaza)3Ve6ul_0b1623b+gk{9*{1f^_uIlxw z#T(ii^8CqR$+yB~e*a|k%X|nTq@fEyNAo;`lBk!6Kn5yMg_o_W=^F5c0?CMz8|o>n+YDt;3~pguNEFl=a0>3VraRH*m#AIokmJnf5_lU(B=FJGq@zA&XM zuRc`;B_diM4<+)42D7)3IKe`rQox`&>v34)&CH+ zHaxAa{RcH^>60Gb68^9(yD3^(N4b+RJXqMzK24GHu&JoaoOPaR$N}YVowX4$mIpiO ztQ9XR(B&<*F6z(pw0*9ve_=|~KI`jvv(1I)!zj*IFUSAC&CIRE6*Mc9nm$z=xNdjA z=1c1JgDxel)mCG2k5t5;L2IWIaXDDrkpTKg+& z6nSv2rmdycH^%&zat z&~h>*&sBS{u-nfGUyX~qT7CHB`N%bWGieGeo8@Jd)`zQ}d%A90Wv^kCl2)U#X{SkP zDZ4jo@!}E36=YI$z;Ol0MWm0X7mz<>a~LbIS_}*YVeRZ0O_Lg@kv>XVE?l2t#4IB= z251lLQckmzBS5O)F!*RBh-L!0I5Z>^6Fn4WGIZ7bR&yw3{(y%HIsmOGtEmb130PTK zK{Wjh9!vzG!U_#E{J55jJ)>c|L`rmka$0dg*OxEH{FSto*1vN*#w=pckvc6b#B<{T z>$Mxdn<#Ja4%(lX@I2V_zS2UT2mi}F>s89hZY!gsMkYI$rTeXuk7QES7$2+^I%xIw zm#Dyo4Kuom&i4%4?35=2&2F|>O>Gp&n>RlspL;#Jx;LZQ)PPG;+v<0!1m{_<84Am>weg0T?!b)@773p0}%E*!)4-4Q*7n=`yOa}gi zp8r9=<>1UT3>+KR&JXn*{Xb0o8SC0p8g#}oRebXhBnco0T2Wk2BtE;n3(wFipn2f$ z4?9%Eix)H@afURn8&LAPZT7{7F3#7U-6?rIaPZ;vBZIB>L2Zt<_Tf6YHr6(YR~kI1 z9M370EZQ4$DOSvH#g|UwA6vzH?b#i5e-5|eg6_$+Ys22Q4~&g{>9$P#(auJ7J+!3P z?7)KO$Qi%d1=~OR%FT!Pyw*<5h()}sHa*Biz37dQ9K7!*%iOTx< zl}5t@!J*${QX-c}l6^w2dj`X{7h8Hvh+1he+f?q;xigUQi-uvP-S3IfZypVc|D;m( zmgXKXW)d*2eY1BpxycO=P|PvYTapbKc3+_6BYt*mapw`8-xpYPr`!HGa+&@hw?c*~ zyp3{tXTn(u4vDa@$SQdEHfxx}e$Gy3`g8b|D`vgjX8Wk0M&*QVUL0L~glgP9)mHo~ zO7W+ETI(c>dsr0JSL%hnt)2-tZqH`d`>eG-c1$O+ru{!RR8po!}5hMmG-BmeEQTHKSXo1Bje=aQY(@;6~7fWCY@wW$?J8l@+w?0#NYPf>K{bD8Gk6R5}m8r<|YkrOMxa? zkx7a%X#uN7uG$%MCCoKk_X!A$tTVFfY#iKk5rh|7k80P8QhTFs$8x9U~rPcG+>FeKoT^oqYWRU~oRnAI>dZ8jD z@^9S8{#(PXwh5IJTLug(ACHJ73>N1JdCY!3Yd=_{mtdz`KAh)!Jep_jM^bgpH=K}r zk|w|NtXsAEJu|D!qth}L=NTufT;e(Fj0Bs-`P|ODd-ue|NU7eK!R}nQtmus&W0H`YU&DwCnb%Uzm5%hO=^T34(E%M9&u@%&7!Di`ZyQz z+XHnSv6}}uoS$lH+EXN6PTdFw6IT|TDFVw$Rnnq%K| zzQvtM*~%xbZD&lGFFwDGm9bQLsyTA)@;7PekNoR;(WuZkv^M@)C||2(dZ@UXZf(Mu940e-QgjnLqsRi07~)O?HB#mJ3cOq6(^^^H7*f(qI=NR_7LJ7!6cq; zkg!d3Vcc(%{Q0U`XXSUrE9uti6w&HdzXt%$Psd}W9#|O@Kdo+MQzhSA1$e2+_zOsWhskN;&;<5S=mcbB95mZJ~p*u z^A2>LUAKb_g$YG#G&z@c*fwYXO@@V1w17CsGBMSV7gbWr_QBuG+V$dl^t-V+fyg)E z2C>-y8O6p;YaK5;=py6e8%ckG;IYoj>fjXl*+bhX7aK5J`e1w(0*7>Tfl?iUn%e+& zjsZ=_lSDcgUq<->t-a7FKc{4dI_{Jgw942LFF#2Zz@X0T>H_(X&W~rs z_=hp$R(S!o9jU|TZ59NQfS5NDnhZpRXa|R$;S47Gq`bBr^1(00Y7lB*z0_*|gcPaJ zzd-lZF=B_10sw_%Ia@B0!iaDXoB>87KB17f;Yb=rm}{WUg`^CEuQzC=0e4W7tRl5H zRQ{zai0PMzm54i{HM-7NJ=2Kx7Q$c#O2|LFyqd-6oyGysgTI+D6 zTR@vNJWKnRq!<(p_#KiDV{AM+K=>;yMM65qLLQ18!7sGZQc@_UPFS6$`nxqTCqrJ8 zYB`V1VuioG|HeNQA6w|#7tDpE{pTWTc_Zti!=O54Y4ayn<)Wblqc6q4Vs=ZI@WRa zhpLENTI*lxE*+^iGuqA0!2!z;?Yec*n1w)jAq{~1i%|3;Yofe&44ed@u!574NOLD& z_M~x~%3cUPVCvFKY6NuWG}OoU#fc2@vWQvVk~oyn%L3dXa1d+@ri%LL;-A>Z44UNK zzv&JUw6$v7E9YM!$3%pc)a?O#USsT$Rt7<1j_xb2(9<%wchRk~bP`x&v8IK@00{0zcKJ|LQ`AdK!gf343&qFta=u%L{GU^VzUz}KcS3>`V ze>|XfJPIH+Sr|)7f6K(8H%}q01)gJr9QLC?hQd|MzyuN*PWDLAHbhtwWiK*ke9F7Y z;wgB90efzda2EY16GYO&U|+&8=aA$4<-~{+!WD@ajHI0t@)U}i$GEPzzF?REYHxG} z^-gveYaZjOuM6l)g z8M5P{aN;={LL7kJTR{4PsRbB6;4GkoFlrbydQ#X(`eXW;HG%GBgLZt+U{v@yytptt@N*4j zd!(SouU#&-JM{J-1pb7z9I>0mdkuBd!(e$*>DQpr>)we8{mTngtMKx>&r+Cj!~gkA z`7emH{{X{241DlpU}333mbs#m(*4XkU|96R`*ZOXNO-9YEF&=%`Q+(2z{lk#ozX0^dElNcnphl(yIadiTcfX77`W*JCjI3cBhW+wpD z6fkvC7!m5HBpyUwzL@*oa^GGM6$8@wD)Ej0PFHxui!wkK%Hs)ws|C4t_Q*ki*^-8= zI{7zV>fhWSfE2-u6H5j@9C!iP^a2b?WFU}w>?m4=4M^044}-k`rv{8^rwt9GKk1SO zC6MUN6JcCCp{Dl8vISfoNi~BOxGg%!47s=@i>hpbNR(lMtvE8A9a-VH3{UreqyAHe zRNe-hjSGIV4aEWGHMKO;?eG$xBrz^ag0NT^%y5VX47vG#wdI?f)Uk60Dp=b3 zKdtp;duMV%+T*-llIIYU)|(qc86HqSb!UQA2RAy=&*um|2GIiilW<=qcFF9Yj*^3` z0f{7Qw8dyaC%TF*V9^p~XGO_lCB8pUvfZFZ?j8icIiFta4Xx5A>&Yj*oU=zPzw1V z_W34!SpfMYkfLpop@nQgsG%jnokGpT`41hp@4vzd>$3JZ>;CWT%;#(=iZcgD2Z!Cl z8azSG5Zb7@Id+J%@E}UnZ{{B)Ob9Xu!1LnNP|E{E=aeMkK58sos|Zv%a0xNkLclXUPd= zl}by>9zDwEx>_=$FX-$`U4zxhvbVnag!;@MiwYfKecG9DdeQZIvHIt45?8HC!n9<0c~)h!2n3hfyNLI`XJXcIuIhF4k$hPp zm$psvgp`!NbNYGOx_feX`*%LDSsn3z_vf$c*%f=?MS*VtuX@}mtsJ;SbNfxZtwrv9 zxL7~BUHSa^59mdHI^>{5{Rze6;lYL-_>I@Lt_rj_faDu)3HrRY@R20+BgBI=)RGmK zRZ)U%)6*b=q1tDof?p{+s`z_To{NN&lM{KJAq)1-qM@hvyWuA-X`lm{CJeYE^_pe| zwa8wuX?2>?CZQix{HvDMPO!qKYnyW>P#{#Tp@}h zEFsy`O~O>blcIei%b&iD2t&<76c!MKk&p#=p!$c0dr@d#fEsoUpX=gWv5XpZ72nDc z0wH_{>i*)z$X;}N-=OAaYT&I)x$Eg!q3XbVV9FhoD#>dnD~GrPF9L9{-_Jyxr=wUO z54M!7&V=jdMRM{+SCs79@0)##5sQe`HH~ym*loj&SAxi?vB*~IEpoAnkbow~;eUA^*N|;J zEyVyYwUhdJK_`gAN>u3MJN??RXJ;3~9dp$FR=dtMIKx0+bNI>XKe-eetVQ`4&(?E~ zsbKjJLP2^a`#ihiNK|1<%PH=_w?ZwSFc{%BRnk7a?_7|RmexS`lnTzBO9(%^Bc8)x1ics>zL+7aAduL*53bH6Zx`MCP^3cT# zGj}c~!F1C3(AzRY%b%uGpC8V`w1>qr`x_uS;}5!W`elVCY9?NUx;ZqxDc4JXf(L?J zRoLm5Achx6u{x$^iPRfW{ut!8WInMMJAmfVaZ+ucS$yM z3Q!KtVQFb9i>37K+qYjhQ9i((GuVr@Og8E)&Sq4;{=vbd$qm8hbrLqq9ylbpL1Oyd zIucU=51d;{Y4WAwwYdwwOi%sTsiQzB7%A<=6`nq*J2 zLIJN@uH)ej^G6qWjV4o?eo*vrsj01gHsWSBVK`A?w79e0OK7ITE_mH~$^RrxdSugDKmt{x# z)tiTT{(nAD5q?S;drfWGty4vjw1K|!{>dnew|LE+t8(4M!zoWnZJe|uqhxn{dK23@ zXjO+|HE${9Y(GHir+V~yqCET`{CR+*RQq72&PzCAD|FM6hSH=-ZI)sm6lCDGt@|+- z?oa;4W$P+NXw3a$m1+N{e+J(8grPMyD)uXMBk1+h9cqK1S~M6?U7u`<2|8?slzNOabXhH@`GcP)Ci)R%ONUCw#o=E6@#Je_#5;8ae7`yTP*x8a^3 zq8Rz=(u5;GaA5KyTaVh?pW39oVxn1IF2qoMplH*o&fLj;RZ54bZq}K2Zu*V)tlVg3 zNNJuki>uN^r_|jtzO!7GS@CCUu7?HaMVft>lI!WxV`X~Z;<&n4*64e1QLu41z1eRW zEtUD~y-7#fAhLR4Q`Olr^P9qN5o>DFPT%z{~#?I~n9~29u0pxK|%l@;9j+YUe38myBBUJ#)qvgcHQ7GFyB4m=rE z(Ycn6j;jA->m7yb;t368)h>R?Low5R23GgqHkJ+=znA6cd)0VaG+{lJjG%&Zv4NIT z15>Qd@#p$%#~BaO1&PTzH=VG&@i=k!rT*niG(LXoGqg{!Z$JG@Q-ePGT=WghvB9{+UdaJJVj(W9ab z1?K(V#uHuXT@J1aYHG%F_dUceU0UA<*)rY!isE_*`-Q-w2H7@9jXw<$BjytnPg+-S zW+WsM@~BHRa;^ZRAw)sg^&fA$qx;D`}r97?jCqTwS%=!edhRWZq+l6BW*n;oJW&iKJm1rrb@MA->#v2 zXxPtBq5aCq#lx%P!=s(X4#;*fUSth()W0q=%Wm~Mhqx~Hog;Qd%{~Dx??uF+MHYPipOe*$t@tw=~)a;WXZ=O~g(u8)*39m=5Hr5KEM39yZ zZg_;+a>Bw4h4kn>-MRPQ4UucOcdr0z!|`9gMV0mNmw{uekOm% zZ$%ZCrxcQ_t*Z_1$rSG!46qdDW9VEyxJR|k#+1kI(UXPi-wTwhbs6dXj+k9uH1^b2 z*VA*z{q_hmZ*og`ndec6QfRCnipFZ(l$%8Wm0ZQuG(>+@6&fM11e=@65j09M+ z{=2g$t~LHu)yjVR=bzWq6f6u_xUJa{rYcpaDreeukm35~$v)mxxmG3H3EkrDqVha> zC10&&ypDwH-7m>HTwPzcfxUzK0$v!ZRjSmaF61;+h^q{lv@viwxYD=n9NWEzo<8FS zjuxx00ALC68=*v7zza<#Vh7<5k%KLrh==s`SGeM;qUf$Z>f$0na%SxzUgiAJ(9j@5 z{+rZmyO`Gk>#8^?8xj)Ih!`aFM&px{qaS5hPdPksbE5_lO@!EFTt)@OwXkyTQ&8y5 zgh`M*Sj0a7&0jJzn{x7-fY$R(T!+V8x@->J)T@~&^koZX?oy_u!M=@soa2bs9kJ?VY@N^JZaoa!9zsvm5e(aMRlmdISLDf&mJv_z{_ z@kny5z|R_g_h$v{R-@(|*g#L(*>j*(;QO{Iy_W;*! z&VU80sPAi^nM!a)-+Pif_@ziZSBP%siSFmjhlS0?gRKr;Vv)F`b;u_|hgsm!n0*$< z5#0)H$xj{pLF#{uzg0Xlyo~v{m~y;;i1CF+jt7S`?DEc|L&*4?t#cqz&8w=a%8T<> zWZqu)GHpJ8G|R_#Cfu)iR#(qYHS@!}i_UA^k4FACjvM4W?!9dC7;aLmoRB&p)m4>& z!LZYgK6ra6d#YNY#wq!txWL%ACuH87xXqP4w|jCiUI1;5ZII+k&x+MI^gZA2)zv7s z`lENCq5grVXS0FB5gqg}Qg2UF8l->u(~2}VJ?lLR_y%?LvQ$q*p7}NsoHzaQhNx58 z4d3YFDgGQ)Jc8cJ3Y%h5A9iiJ>`;CAtL{*< z7^No)#`7rl^vSE>)}-Lcpd+@`8~^O1D1WYSMY@8T{7&17P$s;n^nQm;@Cc&~q%@^2 zu-Nja=G_CHI|8?vM)}k&1Y_RE%t-8l9R7e>%#rOR8F4>l(CO4JGAU2dLk5BVgCsMs z_!fT^HDPg{)-&nPCBd*^_B~7pAuog7k;HBJ>TQ{WcrWtl)BLaVxi9>b@cU;=kR@;h zv6W~I5bR^%b$jdWcfdX|12kimFQ&D-&=67qEhf83-Hy6q#=;xb-``K&jv3`Swyt24 z3p^HNAtA6ml1V^?B^KCCZx+_8lL|d1Y%!$}YOFfCXX7_Bm)UI)1YSbKjw8}dsDM8s z%ZdU2JSrwsV~=-50n5bSNY7Vywzs_laaGza1o(gY^&8DK+@W!O3v#CJ9m92YrE zk?joq9(2Y{&1O)pp_3yypZFAH0ZPC1;~!&pD2?>c2K);Mc>yX!_gtn9%m>+o<~H77 zf!by~*@lk_)VmYkVcJogWQ^h?QIT~sBvLZm`4<;z7h+PZBxF5m?!5n!6Z`Dhd*;Ms zV>7dAH8ZR4^E24XV26Z9%pS{CIb;EuzB3*{dxhBUqVooo4&JzZQkHzCTmJ^GLRfZxb?tp&vXr=lX6uH zxah)*d>0e9fEmJ8*TSy`lCRFK4!P!B75^k$bsydc0g~8=oQ-!71@k+@`)Ut|MQqE6 zL(b(#Sk?f)*&8f9*)e~6Uh0?$PXX^9Ztk}ahp)UkM*_m+>xT8zgB zaV%wMQ4y?HTN~!I-vNq(%{im3eQh#F^~%z7Nd8GOTbcyJorK>q4SeYiUN^ENsKq+l&*C?uHkegLy4UEJAV#LI6{le_+7oKp=H>NeL~kHW9bi@1J^(NhS&IQ}P!z zHS0lN;za|j!!MbI{vQK^zMb6`1S`RZbU0xWibZ1Xz?2EMDuJ387iN2Mr&dP-XaB8# zTt`I(_PHmP>1z5yUb)v^<(cfF!Ojr;^H$iaK9=eV z>!Fb!E0mPTSQ{*Wmv4T4zW!~+&X&$bgEdbhn?BpSo$~D@6R~~~$L~)+hi-Vx$FSA6 z_@L-M^@xdM$2CO)VJj#oxHMTI zxZnN7SuTK9MGwipDOL1a)tyv~HVVg%Q6t9Jfz5h+!%5tT>3L^wPkbj&&nwUJ4}ZLF zW_G|iuWjyPy;S)36>oaGyK_uUsXrP8NbP)wEeS`t15sjHJ`U%QA1P_xeD8y&bY#yi z+rjHQ{m7PJH8ok-0hcddp5Mh*ixU4TkIy@)>Sk*MqY6>QeEMwPsDsBc0cDprsI(EE)%DAh0eY-Q5^CdkpzEh91n{jXXkVn>;MDbO?X0#v Q75*o8;+f}6ulu^bzCPnU&ht2r<2c{`8fqtLH!*D@kw~;krxebT zNaQ^v64?Uv27Gdn@$7Z{AC2v)i}oZET{-a&Sr{)JGl|4bQc{pT@2vm3%f)ubV1)F< zcxU7TVJ0QcpfQTgHK(ZUFHvhpJ*jcrw!6cSVed#qH4}B4WlN={=`T7e5yt1@pHyUaDkin&An~h zJqpAR{f8e>#5Z{49yNJuSy~=4GBVn>b0-(yJHDX6Ktn@Al1P-Q&iYq((94F7FFbOl z@YYPd(=lo?rAmC9%{`PEicj6lg_+EWEBWyl-Qw=Cm$k4s$maI@u;g5){kL~Fcu6uT z%hya-K1WMbw60&yUa#Tuft#=N3U)0lENC1Ivn}X)k(w%h@!}pywvac!-h9iq;}jPc zw;k&|_M*jNKNnZ;aB^&=fY-ul?L)f~pFdaD;#hyj>myni5OR^pL z%Gdes#%5Bcb(eTza&lS!HNVnIy#$3X4kICySN;?Zf}1^OY1<2e`cN%@z%nZ zKCn%9ef#EDUas&;zlcdFqBf(}QY7KsJEowZAngK2KK#XH!QGj*y>dJ|Hjxsf1~=R$ zBTalW4w21hO?du%gHD>JN@h~0wP<@sM`L$)@XecKBpH4E811o+5w*5FWHchUZ$o_rrCIGw#Z>}EYRzuBjxMzyD$6<_dFa@#mU{( z-TLT5eqEnfY}r)&zZEev=dfVeAlmE&-7ezef0QoU%l7r5jOV;*~x*E zX_^70rLwwjuT#x+Iqm)9DrG6c93LNVyRvxWkU=pEQ_zO`<4dpd^&(X6{`hgl&hK8h zO*|{lfJgMxrz~GZsAP9%OA#{|ZaZ)kY9)V^NIcPFnV`#=BC zlq_|P3knI{I?3jupmM#VqvMRWHg$5de{QZwewVcv3*DdD*?UD_;wU3eREQ3ENIkIH zPQ1dM(~%77NB1yRxo;fVIa_ILY+TWLi(Mw8wQSfyE}`+grAV1Yj@&j%XGylKlkZ-? z-rm;M_OY(6;%7~G@AbD0SSe4Q?7m`RvS=mH;MF}!8Q@}|ekE#s$%h_od3tt_<<*{i zc53Zh%RQLu!;+F)@S@+oX=7IU2I``mhvIxQP3ze(PvsRAahUO2g5qkO7CGc3%s2-% zxvQJo8GZfWAZF1Icn<#XgyiIn2h^T!>#65$@SP5#-Ll1SX?AqJId)Yz?(Z7~9XKzL zXQQ^~Wz3^Pe0+R{B9UQXT(qTzg72>gmHxaQS5%~@@`{XIN{SV;EF~o+7*%)t8dZ2? zSn_EC+i@7GFtg*0yQ1u2EwXifjLCzeTLElrq$+jOH6PqGylxY6G!*hXJY^b$8)AP+K0ALau||(O1y5f+|9=J`0n~z zuiSYsj!tve3r5|?k&y?THMVtV{Gaa)exdp zd6m~8Dq`}DMsQYj{X%03#V%RGDI3TS^u}$sE%_nwG*RNI`1-u%ahf;%=GBNF?q%KT7m{o`P4=>XBqePSm+?J`O%Ux6>n%|VvUU7VQfLe=I5#!Dd#!|b+gd-slKYdUMD>-tYkT{m}D>&U!JQM~wz*TKmtAS*F(|Bu1J zgjcU>lezysa<`;*djKuvco$s@#c`9`JZuO?M&E4H`o)UH#l?y6l4UARPEOJ-)77{u zSFU{jaA$MV#M8(3?|WZJ)$DCnm%dYBL`HgX{vcMA>ije@4vn3hs)-&{r#~cB-+1<9 z{Ph#}jmqp)vNAR{0#DVF4LYv~#U&+Ck-kqlm**=d$(=bvkBxfQ*Vpdnr!eoWxesc7 zYG<3!lAfieZWgua_R;09ddPL!P;fV~;UXiMw$RcleWgUydGP2FrR=tbrlwm&q?zoi z5M&DS%tEMU9334U`t^%kFjCSKk399WMt1I8(%H+^54rLkMW}+GkSV_pC#BVz1COC^~8nDzcbf#MM9&t;85_w!jgf5_O~iMEg;xe8Y&vOQ zZHn$}X54q=2*b?GjG4JPy}+hdn!HTR%tXZf@IfvyF_B$doN3RVJ$=5PKYo-^QQ6}C zeQ6IfbHJZJ4ns4GjiP^gC!HsLh8xJGoR5F;g8Kb8kxesu5Dy#L+Wc`R#P(MgvlUq+ z_WpeZvsq^eo!dV@#XY8|z@CsC=wN1`B*T#H3U_mJv+MmpRpQgU)P6-sHnpYiTb41& z`}uQj$*GT=MB;p_Yvf`0hH+tWW~A?R^%XfhO)#s(2H9;I1_mKFM!s@LOYaQ}3o|Nu z@q*{us3X!`&3M_D*4BWGAVtoHp`pY}QElEO!yjHY>d1NcFg-0TEyrATM#k3hlC|P| zK7;N#UIBrVN=p9U62^i;=Jp`_Sa%oFl#pXQx(lOvH` zd*`f|9#+b!9UYoMMg%I z)LbV;wAx1BGO`?^fh-BHH&KHDF>FuPKs^(@B5x9nzI9LLk+9y*6MD~dm@ z=(WWdEmb^H=3=4qHK;Yo?yZeDa!OhG1D@da(pbUPuC6Y>fPk{(SkFzkK})Juz*0wZ z^KB$9yC(rv{SghGix2fF_a8XGdF05sK#XK!Y}=@#Ja?$7>-tJI8=zEvQGpia<&tg;X6G^L(C^6r>b?GppME!iBJJ9dvL0W>Gq^1Bv4#y zO~2DT?9*nc2&j{8P!h~_`mvw9!n=3xaL?~~`j;V!Dec#>+alI+^jDV0rm+z?H-dkJp5X~CgRXP|5OVs(S-$W z+!tECjhT5wl+Vz}XrCn8*2SeI4~xa-kr|ED7GMQ>W1)yGN=iz*Sy;A+x9IEYvfwcR z<}T;xkOiiPKY2o(bk-m9fB1Ne%#t}mo1ozLbJvVMENm&IY~M>jkVw{>+lMEOny#Bi z7)s@Ny@KZxd5RZ84H85Bf0c3cVlr)?_(-gKJK2eb06ZfU^!jgO+l#4GM-04%y)^%ET29pD~-N?qr->)VHYNz=xc5w$s{xymfoUj7@5J;0o%PuOS@Cn zOA-`6L`gzQtGMCa=zF9Sz}d{khSBZCIuJ}rNx_$ge*admx1Y{$)(twq$w>iph;-N# zf7qmN#ouorJJUphV_#%FwhaBwom6R>n++ZA9=Kgf%5Dqn>oYo}_il$%*Nt#(wvQh_ zQnS!)eE9HT;t5aev0VcCfxtNXxw(ndxK(;NQ!MF%qT&Y4SK1sGuL=KS@b-F=fzhS2 zXK&Fmi?HLy+@Ulhtr=BF)X&{R8}yvI?o+HF6S?&whhh|)fqD8yN_2?Iiqm;5TSFduR>iF#_fq{Dc`n86( zw%=Tjm%+O|XOMFMTe9r>6_IdI8mj70t*orfuZ(*M@G}P~T6X5s2QUg$E=&(LwzuCy z+GIz*Zirg2C-Ockbl7 z&K$&a-$m-xE%9U}HQ+H2o8>ZEjjvoOcRFHx{`~p(7CC(}Zeyj-RihfZx`L4ZkQ|g! z@433VHUP%cxtLp8mLteMh>98scR#?z6<1JjN%wP24MV7|jg7OO9_tt?>MK{T-cj+q zAyTdIXDPgigY~TIC%Z7J@HtAlarGK_(Mg0{kjm6H&_J?P0bAf734+wA+KH? zdXt;GPe5R+zrTNzs!v5nf04uRS>OeQ-xme=`4#o`*?_TuIpfZzJZm0C`YFE=6&Xo9 zF*t^2KuInxF4$H>LqjA%SF$+G)VSv1XJ=E&XGrfy9m_05mMRhf>BRPP>z?z#vqgN5 z^2S2iv2$nL+j3?@uqaNufm=`#Kb3UZUQtnT>hx)OV`EMuV`F*-hTGUl7)Y}m9Ym6) zG>M2|a$a8E2jStqsEvW)IPu^|j~;#T;>ETR%Ws*b;~XNuKIp7*b&%bQGo=X={9G5{=x;~iN0GNP;l@)lXAXqTgbh8 zo8G*6<98%*2P0zw*n|V>F)T++-sa^o#(J&3H8`Z(?fVrqg>0M#<{hWGzjhp7o{(Q&sQ0SG3J2Orn*afAJIu@{E!FevRRL>pQx5;;W_jpaXK>tju!AX7n?x&~UAN%ct6|SeJhpFy! z{{rZMzW~qz21PMC%dFq0T9{Ow@kl@8q=^al)b#Y_>^4+S&l=6X+ltx#{It`qG8EyN zz@Z_>7kL1Rt_Veljdiwu|IUuW{sFic`@zo(VPpyN=debJ7|AN(h$M&#;zO_PGmI?= zn0KENTLAMA6O)pXh@iAJyk=)3o|sAfSrjitm(MZAkAaE_r1`a1JOp8~B}a#^($8-o z0MH*r3s?+!AV~F>f%op+sxYFrDc_={th}kOzrP|`D>p9>0DG|oQ!f~y(qNHeE5-tt z6w%;z3ahdd`_S2WHxTX-p$(VtOlHEtZ%>i-O=Ct&DU}O7h8@HSt}oxNztU&BEueFH zI)915^amF{y~oA>A`A0!mY0{k{qw@rl5e+Igx!^oO!*OIyv|V$RhrUI#4(2ecgsB=gCq zT;Vm~`w%alombpX6@O8%wZ49j^fac#)S+SV{d*EnYtm(DowQv{L5fTiV(#FSxd{`fy=CKI!3X8 zGdo6`_DL6edDWU6SzE0&W{{HRw5kjp2Xkd^rc+T~9vC%Ir=Xr8kfS4I-6z2~dzqgl zz{iIYY^kxcvo^s8=h2|vN^RMMcL9t-2vtsTAG0#_=R1j7Na>Cf) z70e&RMkp5+RdyU-TkVYafQRIB$W;&yLJkL>0FqEtRAi^V^+x&IkL$-kAtv@-{OKT` zyv+V`a@AWQvd$!`$@y4>ipXH`p8@jJmV>maA62>v=*@4j2QCG4ISVt^O{%3txn#Z6_=m>9rb|~+I>P;2IiMW%EmCMTL1whI9ZT`ra`^CJ zlztEI4*DQ;gGo>->p#o01JRawuJv|XLrV))K*c`VkkhFxAFc@9nMtjUt{im)ps+gY z^{BtE@BaP!?6f_(Pt^|S=;$Q&W)elAxVR3}bMvpLSg}0JwSP=HBXZ7f9nNEosuM{m zu@gQ@gsAA__LIv`FS*G(fjJZzK0FkvC$OEnz$Pmz%U%duXwFIqB>ofUji5@nyV67T zY|_uBoDWrg7N-0&@oR#Al+B=SVy&XOM9`|vk=DApl39n7_g95?q*tdi(u8*9y>+}W zcI|bndAhzz?aolE*6MW8aMgi*R{U#G5jJCqUNwk)PCXu?LPw7DIu;Prcx9!cc}}Lv zRWmNt?(=t*6*rX>ndyIfYo9Fa&=FNF?R?~|)w`m}&fUD{qky;jvZ~n12%a|WQXct4 zhO}OfYLtl82VggnPxs!8Vb`8hh(CST5Y(^MJSJGPk2N(>U+%PBNolc=oc(5uqV(?B z6d%Qe(%V~)`{9o#jY6L9tbfiEXTiFY(<6e8a4oa8rZKko&_D5P(zJR3Qr0shAyub5_fK~5N z{V1Sf0&-YcS(#Z{vgECvulqA=N(8If-)*-s^l>2fknzhefei~ipdOECf`KZ<%@68X zwI?Meeh*bYKFORbC@C2@Jy;J;BeYsnHR@RC#p)|UzrSTsKpOzv=R6qglz3sEQER%M zcCovQg4eHy*eK55Z*F|nVlmn6Hm(%FS!pJ$_@{=OpPvqaj+K?QDc-L7=XHYM@(T{W z+h$3S5ak8aJ2z2%%`n&+TD{-%!R#z(95(0gWIzB=W8whBS~Cnzq5y+<0kS#(DuT+> z2Xg;YsEM!}zY_b&^iy5k3E*6kVb{AGr_|MbtNLXD{a?O(Ns{T@i>&EsJ$^e_E^NWN zATf~=W$!l1Qk#xam7hn*64d2#I!1@a#uQOS#5niSSauig0aJF|yP@iI%6X%e#Tf*K zTOFgs?}1mcP@A~_X*}8IMidW&^|4hG6BBP(`!z;WG*kbIMHUuvP?{7vZj{}nC8}4s zI2kW5>Cds!TeI7?82;&0Qd7fIV04^x(F6|l$Vc`J)JD9q>Ja%cFhEWsYE!F@TqTRzLwDqE4#s-1@oK($(o)`W znme?&cxkNcoVpYjUt}J@VW!KpiR5HC1J9vDPaEt|b%J_Oz*K<7$hGO=e=LO^k9Yu5 zm&1>0ia%=@e)Az4wmr!1vz!p+IeHuDSAj%xn5SMEn^Yu9r-}{$-A|CyDTZ)(G<`st-J=59%AuV^fB&&>CSl$i+= z3KB7XmX@!+(e=8E&TqO=csoaFe?*91exzSt@_hToMPR-_x_#SaW|5TrlzJsN6XxbfZjWwkoMG<|Mmjt6*$J_ z=W9z=@g6)_{w}V4{!7X^&zV~}CsBgGHzu1O-@L6YmpZ2&kp&@gz9qwx>-d&y3sXOf zQ$tQCH2M|A()m(Y=P|Q|REV6f=%F8SQuXDfC;G?XZjSdP1EFMC#h`oz@yRc2y* zLxx6GK~|RCCo3V=)oJOqb4*j5)Z|!p6#CjK$-%*NC=JQHR;Obt;tqgl(|&uM2ux+i zz5FYWj8r>;G(^3@GLguC@Zg8GY*Tq|(dHz?QzBbAj(5{0H1hDp>_qJ|KWgK}oM~mE zeB#8NdEdpTo@MTC_vyM!*O$+m!+5nOTC@!C*1NISy_<*2!I31j$U&_m2>a?Q+e0}s zVq#*vtMWnXjwg3PfU!Hq#YKgPk6c`+oepIOY;|Ynp-N)6KCHe%XrblIFC4_9#S&#c zS?3{gH42o{U2w!gKs94H-d&XMGR^%tMv8fMGUk)%)Ky`oivG}t54ZnuzL=(oncbiw z^WkW8m6(Q`Yn@|(qodd*r*bQtmwvNy3ttS8obvmY9_v0u z11g(8gK>b{C$htKm;r=YvOpB?R(#EMTS zDq;oo4&n@z(j4H9xYq`qnR9SXBO6ilqETu70ZYD*H zg%H|oiWdf~rYpqswr}5_Y1t+O3dGRNjGDMUHcw(pB^Nb0wj4ou2v~+G@0_@$=K7%D zv7jQ>C0Z@n`KHL3b1N#?DR--{d_cOU0@w`}pjFuB^Q?b6MHt4SaAmgR=orZ7RCl~ z?VSJo^UwDz>irLipal2|CWJhOw>L)KYq@`KQe5VpcG2OAuGd#@;IIw4VKr}nXxu?*@{%lA|%&X;PcUTPM zkXeQr6P(A3<}|dlM3eOIV%wHiRvLl(Bq{nf0Si6L%4#g>6JugxA_TvuPg%^*oNAto zKp_ET6SRNQiRR}iDKrM23tSMqlTH|`RGCg4gaiU?TFxOK7aTsfo8X9xqrBOvA-m;6 z^I7R*IND~sC2&@zvZ6w%jQ*NdgbFvE0qP*|AbUa^Trhs-MTVpFzqLu(9lPRY7b=68 zk$biCtXUy$forU|==gkuWfRwzVx<;{a#cL%jaWWA$-n4leW_}4+u>E77M2o-Oz@2d z`634o{E547~{EUj`At#EDe}-VBZ9c^85L!5ya{D0PW>__E}uJHn}i}l~ob&?TvY; zm}=?B9$0o@%!`3Hd~;PK;KC3fA#mDh|j zG)5a+TN(do*O~wo4L*24?>^t_ONdwu>XJmYD!Z+G?n$sc&wUhF1n3|rl)Vl;iQur; zZx3lo26h>UMO!wMJ^6fJ1Ndm1`Iob=Md&FVxO0eP4XC>m6laiQu~S)D*$~gODq7u| zWn879qjL|XFd-N4@zFvRX|hnb`~YGL*@V}Ymw#>msGL98lIUt=y10SH@K1pFj@zZ| zw5k&07wiP>FYh&3(smwyHkVrgx;*ju_S5R>jHVpa;edjgn!7;e%XMe&3=Rz3lHZkZ zM4WQ_OWIpXr%p|b@Tow5OxG(YXMTVHftm~iWMfwstL@XtD_DuZ_<#QVp3;;;HIuQfV|qCH*P;6wRe)puqLVJk`zaKY-D^I6^lq^@;p8-zUz8XZ=oCny1RSfG zT7g21o%%!msD(&WV{Dl0og z4Z5SoZnL%;_Ru!X(K-|+k>~hpy%;|VRUtxU*Tgs1pt-pN$mN%EEoEW7I<#vu)&Q^+ zJu7PvoGQc`?>pftc&@8z5{r@m<{+%*e`nWM7Kt(M-u>jUy&v~yr^=XWHn(vq8!fHy z9s!Ns!pHol4YCKL#;C3HBz`bXE7UsJR6$IC5Ek~+>GD2mxrWP>=UUp@hQr0`-e@T0 zX}##@qLzCv{eeIHT5W@Wb!6?~S=Ds!k9nzG)+aqYiiBAny$Pa-cG53x=lquSWHgsV zK0Zwt-y*J^J$ts{%aCl+wb$ptP7dahzAGTfaX?DN*?7(cX#P zvV8d3?#ILggS>-R31tlhs)yJxkB3aVcTN3+fj8_vw1+t=Cu<+(pCN%ZDBA&3SFBGgT=z|4O+uY%jSh;Od7mwS89) z##T%G-v9L2ZBBE*+=fgBrlVnwK|!n@GWWDz49|Ty8a1ewnJjr17{oBIqk>tr?991y zx3Qee=Yw~tMX5NP+7^Ve&iL+lLv85iu_KIiD^iIrRTepLDQ#dW*-baToL4#)7|Yk4 zQovniotKcEZLf0nXvg#GPZ6l0IVIWv9xT&}wIefl=ve_itrAc)D zhLaN~H@C@W{lNN-B2hurbNgM^f`rIISnkN#U2@+mxbWQ1PCOcs_Z-{OKh)&7te~*) ze!h2UE&|E}4CBTL=8O4VV|F&_#plGLKhyLmoIu)ctX-h&>YwyE>a^%^Hnjz$UbaZ! zpxXYTVfx*pG+XCN^&bfJSLan2$vQZ^5tg+2urU0!*S2;jOhatr4gTL{mU}lt>PH#y zqUBfSY&f`9kuYVdXfC6R?;7^6mkrMd4IsJGmZJ99KPP->AaGutei4nqHp^1F9W z4yraHVwI|Aoyid*T$u|c-*%cm%Oes+i}(v>eL3d`-NXC$NqC3>n&ND$%E1Nhhd{cr zsPV4|wIx=$Zl`bjeTHWTynncO|LU*dYuuh>j^fdmX-73cW&yW>Xz8*Z)c)jvX%C9?RoAsv6G-%>8Z;9?MMALY5QN)Zp0LA zI9`fSLE&Gr;%GW&j!jF*|2%TfJEvKPQ>h|*3QH0v3PJtGFZfCQPlxOOy5i-(7Smy*^Z}kFT;G)@qi|{yc17m3R{p~2&l1Q__~AHlXkivCGzax9;XuF! zqMQZINZ7l;4o5=i@>p`DzU7VT8V)jKds0H#MO5MlIa!9KwaU{HKpiO-&-MZ*0k}4VB^3eoisy>PmCE8lSjweoCd9{+lQO|8Lf0kKMl33UZr2e$ zk~b>nbLSXH_)uLp7Ej0X$ZtP9hu^!LdT1j^89F(ea6e~gVSu)ia7I&*Sm;i^Py7Tm zsib5tVUJBbLGqSfoecR{TT95nlOH)lz8B4Phib;TDDa1`^U-Vs;m@=k>>~$iHR8(^ z_A_ukhks%EdHpTH6rEmoX>imnO7`f(ybCEpGqpva`^y)~BK?rgPTdk`P#%9=i^L?^ z??WE$1;hi#b$?f*WPeekqh#DKVuq5F4}4#tCe~v!$3Cf^xGk`;Rt2+)xy>G8bNNC4 zyDfVowwP-X8^Q5`8#{RL-~_yse=V?JX_>{mRweOaCWQNMFcc9+MzyD6HwpV2{1@0; z_*+ry&ijSDb)roHxrTBrzypMF4>H^vVs6cJ6!tHyj<2oSn4kIsHe}ylUEjGsNEA7k z4iYUQHA+fy5^ke$=FH97S{2+07R9BC=H_OC3U6#AGjvc40PzagMR*rG;ud&2_o$F_ z^_&jpuh25^xI>7F4^Fblnw$S~eC5wMqMDHPeGPoQJ4g{g?Nk8qD7O$lSnsh@8^ipmEQ+f=um05UaPDb`eo+)77t`Hu1yksxNOJj;iyl0ZTI9 z>b0U}H}LSUZGemfHNkeMfx|9+BHY09qVD*|2b^F`Pa+>`6U)v_QV0YADWT}Iep4$} z9EzKv@o~m}g(DotkF&iWT5iw2+*9m<_z(Jps6oMq;SslI&Jn?TfN+e!j!CG6Zl(WH z3+qK6gluNyCoIWWBPOYi%A0INgT3Q>H42X;hIk-{p(Cwv37l7B<}H0!@*!2gQu z_WKrsVJHLLcn3M!oJbw?jfICndg$md6;DTxgN9~%UwV7vgXn0!wCzn!#nY_j)C5sB z0Y>fb(pJc}&ncdUk_8GU$Tw`*pn({T zq8NMaWasDAm8AzT5QFZ-S|*;|XiuFNp{!12+w>ea=Q$Lr7lM0QOJ{$b24T-fTMA>m zQP%tZNy03p!*U;%V0F(ah7#@b=XW5BkVpvT;BlRQhG~_b^w}%vybbJirNnq41!n(T zvKkrTZ=VEI?^E|$WFQgr2Q=LY=6C(KuIEf$A`gvcX%nwpv>nobM!hH2@S z!XHQ&3Y@xKsxm$+jB8Cq{&vOEa9E1S`O%RIwgr)08zvmo3-IxxWI)e|6x&vPm!CUJ z&{`pN7v3FGg1@SPLF^M}3YlxyQpG-ZYOQD2oczv~7A}5d8iYe8>BYv7^6Rh-VDo?Z z`t{!7NY-v+24-g7N)U>mu701}%)`rjyTWKP;11DO;=6TkB_57s2xiatA)!&nPu99l z>0zYd9_#a!UgiMLjRyjzPHN$_?Lf-6o9ge!f)bxPoVsk9+ zC~-@VQc2)7CKa00(UK4Ln4jZGDVK7!1{LYCnU zjf3X`G~ENuq>Jp~H5A<^*>_qvM#jhQ1NZp7N_zD$L}=3Y|5q+tssJ)NKL4G9^d3Cw zBr(*WcM%TfQV(3sZks4sTPo?B0`1`k4rX!Y5!?%n%YxUc^TxlKljhs%JqPkw(!Caw zy&m43z~U&iS@<*DEM`Bj1%{Hwrlx(t9aP>3!fnaV*RB&Q0?6xL4WZHD!C?y8h^+)M zHY?Di6{J1lc4F^gIlV7`6Ks{uP~&;@PCZe1ZWn5k5*!@tJ>5z?z^KjFhvTR0(SMbm z{`l^JpU9?7+vL`xBx2sL3I<6wbC^d-3X3`2)_AnKwo>-IqFgz$yq* z%1%T*Z%W1b=~)?bx}2rm(Aaph%y;YQ)cFNW;pC4{^}aY?wp+UVz5vX5yx}#I^=r%Z zpzUBdCscq>pFZusMBH^j#zdHj%J7ZT=hKVgPf;87O zv74ZWyFHhzO0*pvbLTa<4PXNha~Rr2$11+R+k2Q784EA~jcl8*JtZ0^;2r~t*12@4 z;s%g9A(^yTpd+k`gGgrCwdlb?15Rpcjg6RvSVmG!Q!5H{wFt{8DLoVc8^Kti1?Tr~ z%Qty>{YblHZY6NOnt4W6|A;D6^K&OE50EdwohL)sPC!D`E^5bh6?$PS`;kys$O7rF zNsvf+ZwOl#@$>&Q{Qb9bXfHa3ZlA5bJVAUz_{hE(^Rb?iy?8aeG2rZc#@eEQx%L|b zewa4NNr3F2SbZ4|s3F{+vbZY%Mh57XKfFeu_+Pb!=V8RUeewSHoTs9py~F9~QS0t^ zmgwvf{$UDAcD_QulMF8h|CM3O%L_z-;*+YbFxj2H&C#+bY2MNg*j@XSP!Ylv>DmX_d zAYyiX<*%fK?-KcTAlT*Tz!HQVw14dkpBwK9fkoy~csNm#++oxwkqFf#RWt1a;h?{8 zfvTX3Kb?ZK_4qtH%%FBNzb^b6!XrI4w6<;}iT!`&YM93qPM+-FyEeHO(Ys=_xpS6S zmT))!o#96(3J2Y|p*zu{1|bpgA5X&~?m+#1D0DN*#|tpjfD=Oi&@FVfQ`zbUWbyUY z#oKEOv1_tGl-`X$mij}aca7}Wu>+0dV{f3@} z&rZZs2oZVMpsyQKi~=}T#|t2y4;^*NWx_#)RpKHdnt@pAac|$Y zCGUcfQ)G0GlHdgH@b*#jMh!tz7oQPgj;@{DEikcOhOBQ(!KZW~Z+)Ms6o%XDe zUR$WIDF2DRC_0Ioc5ij(SLaH$%5H=34yMjWwA)$!cZ=o!B@Gk4lY8jBLe))(vDnO> z9mkOwp^U7@dQ<78Jw&%^*SIGmYEWQOf?fEJ$(}55Hqmo!smHg%=w_+md*~l_i+{{Z z=AI3M2LYALM;p=`Jz9C~Z@b!jwYulNZs(}jSUjp+@MsAP*r?#`h8p7jspA9IP;h$e zcc7=3upFS+CnLdA4vOfm^m6ak%UnmK=S#N|wr4}(M!FyHd5gJB?S}&w*skH*H)_(l zUWIYQW`&84@Ys+hrfLKNMv9@>^^I_z3?{0ezd411L_{sq&rfANJ&&U<#Gvi}n%8DI zKdkOWSkcih6V$v#5rX|G?X5N-*CsE0{`5)C#>VEoJ^z<)o-pPY7Z-bv5JeExk<{wB zg7M-2Sh=*A=q_a@Ui!73_#>mDsyYK1l>vfq{jxCM{od^1VD!uTCi?khj}m8y zCEjSZY@{DoIqPQAz=cR3>F08^eonWPgZlyF*cR@l9|cIvkeYc89%P#Sf=;N64~Bxz zGBdZ4%ClAo!*Y7MBKS+l&cE~M@Hl69e!q(%>t+`C=lb88*3H#*qStq?5eO2ZeH=R! zUXkw(;t(Jhu3N61-0R_E+po)UP}bBI_6+hw9(wZYhP4(45+|KBfX# z>;a|^xc%!_O;8IYYN^~c1Utf5U<-l-@>d@=nb98NN!ZuR*@>unoqwT$d!lqrfdL^Q z8%Z(Oi2QgB3>2ORiD>z5(%osDcZWRc4*w6bk>>q*s(*U{@#gl*jXFhMXpuPiIyy=9=epfC7fT6oCKuY-=1>~xcK3hEtaUJLCsQ< z&~6Zyo=%4i?OoOX;7ef<5x~X^r-RoEV}5WDzk@jUd6lJuUr5~{0XO$w)gkQR%x5bCq0AK^cz?ij~}lGExlLBgXaDKg)})B^w0a z1&wy(!6e22mUDh6Ap}-*0Qv};6@>SHNdK`Ph#L_FbwVS-d4W-qcXAT_U+kVUR6+ti z%WkuUih?>RXpDt;@h;7M-P1+RlSUZ5crdT9)>D!!LG}R*fPy8q_QdVI%Q7lP2m1bv z1Gch=d80Zcx-ihLxVE|ixJmLx;mwJC3>q!pb446U4@Blz(VV`W2MM(g4a}<~5?tvp zG!doF{RaMEpw(t%Rz!1M&5+?x6jdRwLQ-!R+vad(=z35#U~XNC$eK#RCK%F zm@^QjxTaRdNm!$rhyQy44>JxKY2#M5a@d3jAOrJie?y$Sr*ZktO?T$S zxBaJz-n-Fm5CuI+u}1>Tt}h)cIf;O;8O4hS5in5#6Aqu*wJfK#GiO>C`l@0nwovr( zNN>=vmD#~5TNnG_hwA9Yf8tF3lpX5G*2+j4FfqNBC-uB_wA(Q++f*WTwEJD2NLyDy zUX+!2Qu;pse@wQQ+>tHc)JT7m{yy0i!@Ko!TZ`TKr+a-hHd$m;9gCS>DD0L#ZrnJ0 z)JA`NZtx>L%DIS$2%_8w1U&_Azj=7SlvGjwO@}WZM2{XtvrOu$RC%3%kkDD??Q+x{ z<*J4aq2uX_fxAm7wo1xey2K3Q%e-1@mtGLlQDweM{(*ssxw&8YK)+_{6sgp{hrdmH2dfhdlC z4TsTEU#n}>Q3B*G7dJOydDG0$uR{cQ)8#qgx@5$#YuA9IjY!lnm#M@{uksd`5pI@O zR@(Ax_JY%@g*ykW{XjvxV23@boO!@s+;sK^E;X<0=Kb1=tXac$&VKc4%dq z?Dbw5Y7U?L(mw*th4BpMPW zC8eNUp8~=H_)SVGs>9|@iRtH_@oa+5pb{y&pa2mszzUkK=7y*)boT&hG@)^o^J1#CPT+8l=7xs%25XC2H!d`rWM^Tg6JCQZ>nikJWNC}J{^230N5Zop zEFu!$Jp8e~-V|{X0N)Q*U830s$|*t(MS4#9t5-jO*(4W!ghEJ0Hxj5<_^vGq9F4QI zzu}|-EE8w})lLb+kX%fa}~PHb#!E8-@v?JM%n8O$soRuI#IR=aZs2I@c@ z7(SVk3(CnuLuS@RGn$8Xoi3T9@?K)Qh4e8U8oNw1z2!$wcef5s&&`FekccfpYjW!0 zxEd@UgE&s)f);JTue2=*%>tg2n-xRYXdU(+ldAss@jC<@XrshYFYxAk$%Tvg_|oqq z)^C6A0vb664S=+fj^#Td3^EhE`dK<@7B1DN1&R`bTf4O`Tp+sjW>)daAZWeubl_l6 z_*z6c#%SrgoG4OLRppYDWWgpw$*-}4;5f-CC~%Qq4}3m!p*3jFarbC*I35+ zSg-ks%jmz@bJSvoP0`FQ;-CTtaX@uh@J;vPVODTE#5jD-Kt`R&S8bM#0W&iTSERkS z$x++&@A>niAQh@O+)i*zwR7h<76=q^b?Lp;<%jAevc=(11V|B!vNt(7DZEd6TG7jt z6UY1Okk!!nGiMsD`k&dhc6Pp^ojKJpt~|4V(<932>q8(Y0C2XwwLd_dm|~J0K{O5) zbd5O%UeWRx-8|%Hi%L~&ufaftNE%fC;X?t&-S1_}eXY1CjGxJIbjUUVX85Tf}buIpxSr8Ay zF)pK{b%0IjR_o#KhRLZ=8;9k>ka`rU6xyfy7|@hPqii-?tf^kmWFSiW2bx z;L=Wv1+_W)EjtHBw*r+CwOBKb>%k5-@LD+vTbN8$3}I28#(_P57XCe`#*HwtP>CxG zikoN1%gKRIm-?Es$?hl>B_PnesTIzzsg0F3U>+L)8$b}^?Sc(ic4sfe_Ap1QRr$~` zOiWJp;#H+$8a=rPOBrDltwy5~G^4_fo{P!N^oU@Zx4twFLVmgbci~;| zg~P6L$v&;9RsZx9UpjBk(S>6A6~L zu*=BLLCWzQ@eS!M58XEtahdw?Df|Lo@Y!Z`A6g>u5l1=uTmFaRU|++q|65;aXZ797 z2rFSr!vPV@i~8_KRigPf=kogB+ubhU*ME&OjcB%PDK`^_k@crCs(5(~jcpB+m9;qF zXLh_t-Oa7w`Ctyio;@kF9s+gfs&&%@|iyi4qBdh%~#D=DYs5a$D|ls2AfjoCQd_lGdBU>0#2Z$2$2;u>0PS_D(-O1bKi6BS-@{isF!d;S;nuBOH+cWXnym ziH62_9?W7a=u5&nj3#PjGc%qIw{Jp)g6Qb=XI`Iqbq5iNLgU=I zGV~5p)6j4nI~HNE+{YMsW@Q@v5@=^m>dv^7N0;5EqNYZN1VS8B<>lpt(+r?gTo|bx z&+n&ut`>dI_hgmy;|`mWXdF;Mf>I&ou_%1(*fD1}w`?FTh@OjqYDH3;pA{F!piowe zktCYD{eprnRQdS&ooel$wOv4{3Ghh!mNm|tSs(Yl4M+C#_8<`S zqZ+EbB1E=r`*t~4)c)qO#?DR^w8G->qsRv<_ESHUfb}*wyn5w(_wH->>Vc_A=$t-q z`0xX?N)FV=hWPq!L`hlR(GfKQ5+U6y0lDSgWb907M06Y({Z z?3DV^k&6h;f#YAt9x}`2TX6h8S%>=GOcB zd(iyNc;m(mWL%tA^chFK_~PbZK?ZU=tc^eT(2!6l)O}nf!Yt7H(6=oYFI^gWT!;g% zK79B=ks zX)`#Ts{%v_=eS#oXNR93RaP_(@?aWzkwZsA6ZhuLBOFhW(*vTtW#lFV>}QA!L(Y$L zCCk^L)Ge6jF^8QlgV8Ea1aA`V))Qy)`-3H@H*ZeBJz94T0!Ud`?VFu>1(zU5Vf1;6 zI~GLaL<}-80e+>1w#?1d)_K{W)xfu-g~Vv)R|`&8QSDGAA?9P@nU`UizwL^u8?ctv z0&F^P;D9kKc_TA$*4sf(fl!FvbZ+E201MFNAS-=3bk~=W$DW5jE@iYbY}@vJ@7nxH zRIuP@KmNlPo3`eTJxy;$XkFAN~}dV8c1mT%?7prPJoM&o1NVozSGwL zCnS_*pNV5n!owMHejC`l2mpotpFb;bUyU6}HNQPZMlQloDl9DQaH%d&`w&iWJM1!b zjjn4uv%y2jg22CUU%I{}$kWD*yAzAaLw~ySvzwM9fiudOpwik^FCqWy4$=W?}ZyI7b z*%!_g*S_IlIIp*WK1qm+lkHe80*1l90u+=PuWuT5z#=8vyLT`AzvG$$bgayLMTLd< zC0fcUK&BE8sF|8ml|XAFLPkbLqFBASH0QPEbnEu*oL*~4d(LR>XmJBXkY1aX#z88b zzkYd5NA(bjY|0AG$U6lhmT;JSc|y#Qwc6_HDlh@~xh{QDTkN&bqFL8dn#FEsFJ5dj zo$3r<4TS3VtC~wIDxSxpkG4qq^qEI&BM&8jIV|K+N;`B2^SrxeZTx0tMazA>Sue{|;4};2^YNzC;rn61W%?K-xa%qNM)NS3g$*3t&shxX0GI@q3 zN!pzovYARtTNty^^MKdqKf&tu^z};@VbgT(c%yW~=1p=P7>LlPPoG-fn9&<4l1NHU zCQ^l64PPE~-&!zCIeP2ae9@uHGJgko@zUMX>vv53sbii0DAI=b4{DAL{`-5@FD8JVO%gym!}{48B9iPt0GE;b5IiQ~33*JU{Zi2)3&I5WjEH0Q+?crb0Wt}=YdZ35l8L3XfBi+uogBON_YlAyUnE2Y ze#X+$(m*yTosP7VghvSo9E?LS;=Wdpo3k@vr*Imk36YxJjm$#%9vKLtI{_33HGrsw zJ<-DRD+g$S*f+$n7=+lqxbk-Wc0NPD-YFHAVF7C&A~qfxz2bN_;Y6TzYpF;{7a<7k z+~`02=iKubcF3kE*S;p1R&6Q>3E4^-`I^QlDftxKF?biOW{Z^5t#p)5FjWs1l)`Jy8 zQ5qqkvZqD%P+DlARhG%vLZL{?T1tgVdm+kRv{5RAw4=RLzsH%G>pL^o+`r#_+{gXT zeH{079M^%*eERhMyx-^fTAt76>v?L#i-O+4A=YjetNim*#e9Q_y)q}A7OETK@7`Bi zR}}E=M1n_4vR^&rP$Pv19Fu9J*T;_^&7@{_>(~w*yxGKwVdOi=qZckQjvAA^o-%g& zLiS@pK_Y}m8}Ppo+#LKYl8z2J`uGDXLLUG$30fW$NvKcI3C;LG%46RnGvL9ypHu#&-Q zGa3Ja{*xjr>fr$rh$GuzO*U%WxGvmw+8{B}NNTaI{CER%N024~>#iY-P%5$r+ueq( z)TY+tv5Ah1@CH|WdeX)p;Sb-{CbT$)q=+4V@2M&MG*bX07ka7^qe*o_6jPcPXMcNK zJ}?M)z&xodlsk|;Hs!A$o>$v1s8z&N_eeB*?;sky3%tNJh|vx)rU}UP%P*ePuMtsf zkAKO9(bav_9{-u8yq+yD45q&Zl`^{#90=$B{Iy+45VwsN$y&xafFh!#6IB=b31_&^ zw$cZjxK@U|+rD9%@*PuRBzF(+t=hWQwf6e83(~uq9P@giJVWO`ZAba*9V*(5`ORhd zVZ$Vl`Y>1D?v3d1!8_>iX|GoVE?@OQW&8WiNHm6x94R&qgdKR7L@ZoWu>%*wlpH2+ zo)y)$_ronwB)Ie#65MTv_?xM}XblhkG*0NK7xyLaQ>kW~sj3e+^wg;2i{dCEi?OWT zs0kB73>Rz=5olW_%SlSua2&dSq1);{GzBM4oY|jO4K9wG}SjvI^FknkkN8`>E69z z2P?wMm;W9(f{y0XFTv(w9zThin2MqM;294ZD-uGw^%*?a)yHQDnmK-rmY?VY>gwt& zn!nj@Rq(Qzca%r;4A&wt0~Fn+kCK9^lD8H!&n+R7bA7%?$-+PT^6a3nu$fue_GRHR z`R}5?u5zz9ABHIph|v~v^HGx~xxtw8%{n<)T@jf#xJTBc`cpUi42$;zb3RD>(|68V z5Hxts2V-xEci721jOdxa)W${ulH+^3JX>*lc56ewujk&`ZvUOb-Ml8%XO>iF9}_W1vYZ1jo(5NuvjREgzmIpUX9Vm8YkrN{n7sF# z!_3Cg&|=+ZabNgRfB)a1s2Am28mMSC2x|G_<;%aZ@P#katXZ>!z3V+bw{c-?n=9Hr za$LCh9LZ&TN~iYig(K*1XuyvmT4aPZ#{0kw%a04`PhYQ7hN4L#iP8IFaVe(IB*?qm z1PSR8qyO1Gv{zA4xn>a6+nH}6@El?2j0{oPx;c5U{b91A7&`f9oTg{*G{oT;-4gKx zz084zhOc18Z0p5+f8&B^wK8nKm+n2%d`IO=(Alk_$DM9$RVb_zD7E9tPnl-I%A(40kuC*Qx{t9S3aENwI; zJ4`H_><@w8paoinf%9ryLR2jPl2dU72+ZiMp+_G75jgt=9-Pd>MNX;{sOz)B{Y1Hz@9h^mR zN#kDjB5=oF$OrcT&;&s4xkmEVEKgZ>!?hlPxGP!~+ViovO_YoS(MONEGgLyDNh9E@uY(8*U{5PbajEXlt$n z1pN5v<&K_`lJf|3!{;6r>MQA1!lh@{F{tiun%i82?!nW#s;MEn#eDomxKNQ}O&ts#_s+ zPkbvXYgWY(fCnPnEKoy)#VdA|i(ANY2fUI@jo&NSw5HZX-XvM|-kv}L;{dH0rWpXd z4kjJ8R#B923YYAPE_CxTK(lCaj_X7CJb)7#& zvTK}^ZRCsicA^z9*yVERqyFzEMX#eQ0pbF8G0W&z_Rgp{{pwCzTU^z_uGXNHp=5zJ z$$g{~{enkiJhakk`G4p+)#NT$M{=@3iN~Gh(&-{u-K*Z1suTZPWTxDz=u4S;YU;Y` z=6oYTIt%h2erwd!sVAY7KBEbL!P>hpS~;_+Hf)pcQc&oG!lFn2N|X8D8kbu8$94Ny zF_X31^~GVWKkyP|wz#pu?(75w3V$tU9{QfM>D{xZDnK&%CN6%G zl+v>aW@cs|k%nAhbSmfd1iQF%Q9t3GW_BiU= zp%$^GS%+dnL+K$Ji~Bku*RAn%n8_rBumb_LkGWqFRX7+ViG1^CQDk|vQ0C}>$u3l> z|EY+WE_F~#KK+PmLUQPm&{Srg`%J~~#<~s^=hzZf*-i0EE80K;&vmOHeq!SJfNb+B z-qHT(f$#NDPqmHg6T&h`yh5qb`v=Fn4pE8C3E1fe8V|o(-mgpd?gYARa2666E{+*J zT0$Tb_`X01&BdhzoU-_ry?1WoG&PUNqTqFeS@eC76ut$Td;dvms3zz1#%Az;%A9H6 z0iI6}ea$1cnwpk{_lt3dQ=-YsI$1#iMHdXFuxNctm39l#u@0c<60dD?OpSB!I_=z} zhaZ9|ucvcWRh`eg452N&eOr|~KVagz_OylDr8X&e!Kt4|^@T*^T}4I8KS_l1uD#UI zT)RPbkHzjS)cFB8sQ z#oC7I4Gd*=4s!+Z(R3xRU%xinIC8+)%so8CaW7XoLAr})e z**4+l+aR;JhbYW1?do@0vZqwl`{}${TU%QYFbavmv9YnZf0l%nwts_&dPd8)%EPSJ z>(}K;`po}jn*nH8e0evA0hDmf*>mTmpQKZsi%uPhPNgn|BdYNFDo1qkFX zyh7E%)&1^;e*kgi>dX_GZs|K9;S|6T5SR1dKA#0c#9zA)QF-#EAer?+caDZ2d{yiE zi1+waJO1(G#{(3$Npp|%D_rr<|~F5w#->`Ds&_LIYQ&a0X_HzX^R z_LS;}F>J`BeZc0CM-l)7iFp*bk@v;doj9dq+(&y5*~3zbT2eNXVIC=((oLT3@M9ch zB0v;OahAz;6#bIZw#xwCl%IOyapFYJzJ2e(N9VpvU7X2U*QSO{-8Q$Lmmt~~H^S|> zojdo;fAPh1&&YUc?unFBMo&CK3%C;~&wN?kOmqk9;9!xCOs#*8Ar9KO{rd;o{Z4j6 z()dI7?pN5uw5#l^+jy#JF#CdtJ1}EDGd6@A#ABh1+3;9V_EHb>@w(AgV}N@Y#}!5I z{YK^a`M=*+g!OV zA_OvArb6rY{k^N**Ie6K4@EN>V-s{GykPX*XD8p|=wpzUohy#(G41Tk@UceRKe3uX zy%c*anE1{j^Jw{{nI;LA$4% z>8`VE8RF;j-42!9CO0wSQyiCTrlWoTId8qcMxOF7w;)9{TYnL2^u4@-F|-h=-@LrM z>~qypz2cKvv)EaxP#Ia-BOn5OnTxrmGNQ_G{y*WIcAyoH=I6?P{ieWbA0XLF6%@?ZwNMU2-j|!kmR8 zgYI%phb=3}<^6-%;=Wla`cqKseM@#Remb?v+o7E>TtT*a82O^0?xC1Dp&*tRFlf5X zVbQCh)dBt->3%hNxa|3hw`Tma$cr=xR;lgDqx|w@a>{22XOz1~|H8PrwgC$)I56s* zh=U{qpm>JYR?JKRTN|KkH-*Ss5RuRnG_Vz-N^RASSTu%*)hNlxFp->Z5){}|XF=hs zigr!9F<>O8RUD&pdhOOj+69BX9U9fNj|4RbbmWE6KLS)08%O*NsG>`p{}-65VdL$z zw9uTvZ9n-}2t9i0msm2(wG}2l>y;Ywwm+7gqNw<|SO84hPSVT&Sssr1qdXL)nnTum zdw?)ucevBe&e&@i+yY}F&Zs#|)0T(+3#b+2y=j7|=Sn=lzB(1ejLgqE1UuOqbnU`u z_%g;nhI&a8Zhx1062370GUa>V=;_nF7$q`YDN4b%l6w>leiV6m@#~4mrCx!yG&UrwMNJbB`BirkV)L@bA(U!FS!)T-#7pgd)(3xzdQ8)C>Tb zBwsN`9usa2)~?Q;!5o(?1IZ}FyG(#zyHzr^mcQO)w#T$C;P=Ca(_O@cPy8J%jbaD# zydWeS%OY~$fjY0HwPQd}qRP`b->I>TzgnQ@5-Q>gqw&xtB8QYIji%^#diovE>nbZQ zY=XS}F>rOjfBL7la9U<%J!X6snmge%XS@|_fns6d1LKwaVLNM58~k7(UEBYjpn!(O zU~mCd1k9@YsZ)4DUT!$6^%quKkPLrFxn-XdLqf;+zvg zXIsakn)Bwp;pV*m@L?i)3=oGom{QWlVpe?${oD?3L$SKl;CAn8ZlcVrtFOOW3#cs2 zs2GPjzaXSLchHZM6{Kv^qF!_(Qa%le$UDe+4MkRN$B&=CrFm|~>BSf43MW;{<2Ifw zD}hk%`;Vd}^|=42kt1!!O{B_b1<`Z{mRKoeOz1)FG^09wsSv?C1Di8jaP8R$u}jWd ztBuMxG&F>PHeLDc_D@W<6ck*{iwFy|+G4E(bck$7;Tlj8+N(Vjt9|F-cD+PL$FHoT zGv1>{q31^*ymf%73SgIv_X7|)_3qa%^RiA#$4Nk53D%8`oE1=8U)x8twQmNVcyEs) zNoa`0DLs%9V*2W+#{6B}r!R~fqq&$5PjE~3oAcAtlRKe9$;&CT0be~Nr`(LZcMMe= zP%i_wL8c>dAwUrW4Ib_2K(xy>WlFphbQ!ZFXZQ|cOeG@Y;qGWO^sqf1_w=nS5nckaXUv2QOS4&wR*^Q? zmOwu7^g?3;rrC;$4*Z!?YUD23t@uaFpYhd$G=k(8f5>)2zl%h0I%+F8*Pw` zzI|Jx8$6{|E~n`Ft8TrE>+(CyVt^1cy|4yA=(S^QZt>OL^jip(d%{11;EF*5{K$-+ zotOyH#eC07WhXYHHHrPF46E$*i*5^(3#pAzyzHq3bUolmZg7L zd%s)R_XOqJ+*tl}{}87K7}f23`&)mA#6(&LWDL;M$#{5)6C#k)-+OC;6(OT)FSOcN zrJwSkRavC4m)`G@Out( zc#Ew^hoMN zJI`6nh$EwkOA+d27?)Y+QU6Z@EpMH#So59N4scSLIHhgdw$84@8#=zj1jC4MZKmGd z81NGL`(u0(!Zjr*qkBt91vU?|4z^*z0V_L0vkPNeqtGpLYqkO^ftMVhXuLYJ5oq`? z(%yJlcM7JtaYz=Dfq%(x)d|UYN!?+XhL0cLH83OK`%P*23(a%(JIzz=8{}Z(t!%$S zb~-KJhI_yF;{HfG(;(d3{sEitxM^fx{*{!NxED-?H9%EfuJjXK#r^zzAB>>s?=p6- zuA~h+OP54Z{yOP*sWjm9C`$NrkD{u3AGTN5Cp`iygpbE8a8 zSVbAE9Dhn~xRRA-?D_R-msgmt?=%a|N}&*U-g_f?^ZoRpLsd2B)Ay3%-oi{T%V8#u z(<{z{_Oe8ILK+Yl3}=*_>ipZjeay7RjCk(&l;Us!LUW;gsH28w3wY){ijBO%P|BCU z)lKuI23rX)AU4$KgLj$L2ePO$lsY6jt8JD8__cC!TC%d6O-(P;p0zaPw`5cmFVfZ3 zpk0E)AWrRAaFas!3;5!ijrwT#u>-Kt5Figu+ z4h^U4vM-Mk2elz}7fMSmWn)O?v(uCJvvpr&XFnoi+RZ4?{f>17Zds%?y-oVb58%6+ zhhiZ70M+`-8Kf#yquS;$tl!YSMeNkBblJC0e%-y!6cLe}{Na(e&fg&`O-p23#LZss z!raG=$n}n|(C8ZHZS*`XmT?7cqsgDdT_3e2m4E1XdmR5aanIfrsFT7s{C9=aD#*R( z>n=1#0)(Wu8Z%+Sjzh`!?&0UeU}5_qyT0Af*Y~5zbQR7!t_evg=(s57E zdGz!sBls#}f)z#jW5y4T^1mF{kAKvVPG8-9uJ5QYj3^inIu%9DTQ3H>g}?$pXdt6R zts@yKK28l|(A^k>REomzUD9xB(=imJkf@2Ixw3xwH#c^Pu_^m`#E1^Q$?Y9rD)_H9 z3*uwq&lZsgM-iOBOD%Da=sQO+QzR-0wxKWpf9+aSI>X%wS8y?wur)V&x$>;%$;tb9 zDiV-lNz7Pi(CjiGB-E4eF@5J0SsIG^^z}|r<;4MgO`0?bRU~s*`-B!U#^AY_xvpYu9VSt;nh;9!PoOXRy@qGyAmlxDV`J8 zcZ9oCUEDY6@PLbD+vgx0Ov=j2lKnE+U(CZM@%>;z7v#l+%1rBp3FFAV7J=MAezeYqc?GT^Xp|#uc}tqrQJ~ZgtX;JJN6co z$=Z4SA7B}F^VeCyWtXmmCZQdZej=cAH_ba~;D3)%Pi(CTlq;zF1U z!CS>$?-7j+HmQS=#9Bq1tR)CzyqqB1ydY3ebr*m^Al|4x_{S|0l-;Hv6Ic(9ll4Ox zK!YPhqeOn+TdNNcx?$UyJm2CKd@xXX7g}_9r8mOgesN#n-Xz8Vkb++<8ymkLhS$Nt zA-xfai(F8DGl^L_gS%4Et@?6w7}v>N;Kt3&ZRam?JFbz=(V??MOu%*KCh0 zmSbOqQad)*<^4=;vEB{T_8P7k2!EvIcad9-1o;e`q&&7#E4+zaxRC)Kw#fO%{^vA( zRHX4!ef(h^9`=9LldCG9Gv&AfxMVkP@23PsF-u8|{*H{F^s#%qsISpAv&q zBuKozeS>G!R6pTX!G(z#Wro6kX4Kw0A`LVsWaX8gJAx1Wh5wl}l&TARufa}rYZs1m zADD&qHszVBIIawsDXnnq{XLeQ#~@pR1Ygaa=OiU*cef>z%RCu zwhl#0uBz^Bx_Z-q#)gJTc2%3385^b0IP`GCJIn|c_bGsIA+RVY2pk;G;P$t1)VhzN z=wL|51dgZ?W?C%vH`}8)G~gpb*xZjkGk2+cm!`kl9wp&9Wy_L~l=edOwiL*T^M}Sk zvK+~!^c4Mz7}z#mXdsO=>jFMoaS32<9+~AN8_uG>s9(zFvWjUzn68VWN{m`^{RBWx zx3gt8;a^|6&6VY?!kI-8l2+-an~aPC8V8FhPjI${(9gtaRx9#^*v~y?zy<*h&uoE%QzOf>h_y2;ZZI5~f^7=(w@Qtw%pi zhy<0VF*y8uGg(~9!e^$kGQNbJIY(1C0TAW4_@t!&z1ayUoUW#Rb1EVM)Y1u6_LKc0 zCn2bU5~(M!hid|c)aWIBL3OfBs_h%JbBjWxyLS?f;$Nz(M_?h)T3ur6*)A@n&1bH{ zSPe~@ml)CeOjLD0e*6xrXp5=o2QTw@v>k0e+5ZvT?VimIKL2cW&i;M-m~6NZY-K_* zv{}szOn5fX4*HIyq$I3CX8 zo9cjB@eG$v?*X}xm~T$Z*SEF~cjzVBIwy&a%Jsqi{*2gn^VTY?c~q)(@B$Oed4>Al zKwxQ!EyaPlql5zU@18O3Ta?r&0*+nvxXh=MOlQ zW*Co{I`yYdJMReG8S>v;GW}Tsfe_y1`*5I}heuZ7I|9{Oy;DxHE&nxYhZ7xTHcHo3@Z$*NUlE3Q8Ou0Dr*-ckDUPS}<-gj%0! zew{w%Aa!am6MC_}f)-~1SS^S>e{sqs#ipw_%1xWUQ|ZxF-`Gw|7oRXQpVU{R@t!lc zqPgn-(@z2??N;kWC}McQdiwlw%Sdv~NzomJ{)Q-}Y zojP=AlbV_;d_2WC>*_b{krD}=i;#K^ED58c5mhL{Q|D&KQxztZF$|mjD%IK;Eg$-S zs40P`8F@KEjgJ^u$Tu*k7Oo)@LcGpAS)_NPp|0*#Lqu-!Fy_F^8rs@B?4#1)EnnU; zl|rx$ujHy5YBbR_d&(`d-1)5O)GuxQC;%-eOc7?M-=IkxiMJDsVN!6Fu2`+x97Ppg z^;ZFr+u+qs>Gf?#Fb9qSE+_A7Hz6V>zqN?Guapa1z;awKFDVYahzWAi(a|Ze_=Wii zL3@b-M%3;&tX4=!Z+h%QjDhI!|6%5B5=}DCgrTOT>r-nt6;=HoVZUw?2zvxgwQ{8- zFdAxM6Qfp`DPz+ATXpM;r>gELRH&8|O@NVzjt}07@mR7J%~(>5?Gv6iRjtS*VmbT>?YYWyy71`wrYsEPiyH`E2i4e zfC=GW_H|<{Ze!_7vMr8M4bLI!DmY{mudw$@7}d_!h!g5Sfj+i`@2I%5IHR^DdG#ju zTp20L)xFi`4ISCO^PVNUhbnT;M(4IG0-b`IzZLnKZqnNn)?d9Wq~J-!LhsD{UtE_a zSeJe%TxoJhr@eaWh1Wkn81ZY{Vf*$m%P?=@-I2RBZ9)@fzBp^7ZDV=-`mxUrPvk>= zY6~r&l@FR+HqIwD&UL2y1s1_x`213hC6Lq0z99(OePA|28KH&Mya1*`1>znxc^f5sbffBof2y)+y?YK)#Q}$%_)JB?Ghx{G6p2KM;X{*1UUuc zTxajPW|ak_`QmK~8Mity4a=G(D12^r^OcZzb2n=ATPCSBU(P|6rz{B%Df5y*?EBEa4@2iCr)@O-v)oqf)ajm zJ-6{23Xa7@eJ&0$tsf^ARX3j7@p{{SPHKN&Sx+Z&Nt|NjCdQ`GeC(<1FlAS>1EuC^ zRNd0o-AzB#HdYr0hRk;hj;qlFpmXH32&|4zZrq4t;AKQ6bJW$xO`e=~&F}K%F(XFI zVGGBtXh|ktw`)GLF4TI*uI0;?eS&(n5FTzl z&lESYH{bTf6;4-F)NxshdyW>9G@f+CQ_S;bSjMwtwEULBx0hNkvk>N7R`6K$4)NTL zT~!x{aAujVAjz2J7>syA;{~nj6!>w@L-s6`nryVtr*eWpj6r*DyXSsOJ^=P%Y8^Pmm+;tD>lFMQyE1Fl?| zOL;u&b^-*TtU+XIw1Jxyq@gkEqyZjB=BoD0+WxB@&g0n60?=4eJE8lXbE^hFLCFyK z;KBJO6-TaqgpADQ?656Ww(TT(c2sNJRlN3?hllVU(Dao5l}fmQDl-f+Q6qP{GfEV< z^rpIq=5wnC_33jFY%7i#p+_kxJzhne@$m^k)4;5vrQ0Pmwetli7DOw-YS;`Z4;}xt z-ht!5GK8M`Yzw33%k=fVYRYp>R2pr44PTw}HoMx`-<1eig8sp%TYoK%Q^k<=$rq4A z`={MY!7iRNrR4`mZ-@aVA83b&t!*a!|G1em^BtOP%tfZeIZJ4#ZQ~4^-t|v7mS2Ib zXBMPg6~ED+2*7P{R-U6xvb5!;1UaiZ81X39qaOnYn4sAa+;uPUajxm7^ zh%UR8^S;_{DqKvZ#%KwNH9LP(c0e$_!0oJ--;BXW$sCuULM~sr^oe7qmvUOs?dU~f zHB*ZOLMr9QXCO!!N1sQ$zovWW@Zn|9TI}reoUnyQ*wwhWRmcoJMl@8bw9txDvyE?J z?`1+5hnwX_JLRXzcWrvpY33sA5ZOhPjIi_@R=KS0$M8AL`|=el^!!dh9&FdCBZvMd zX+PtfvyTVLO%*W+P)T5V4o}YC8ecZ>m1Ij9FjpF znzZ#~J#+g53dq`D?2qWH_sWl(|Q$f?XR8o8!&Xh4>#tM8{kXlrxJ z{#k`hOf|!dn22cTVNS~2L=fQqv5F`ZF8FB{BZWGVQ>Kt(VDXl3yqP|v>DHk-2NjN8 zSoyfW!Sz(fVO`TNsvJ8v>Xw9rbC*%2Z*j!Z!@Fow*WsIwUd^wdWY9_2J%XJn=dl2R zzk7Z~mcZ8$CICEXB314Z8C8nsg?PqO2*=V&R{mMK(F7z-ijEMDx(&A}(_@pX6jp2_ zcXPmih(Jy8n>hW8>lq%AW14BPR(jg@*~0YT+D5Kp!TgtrJCJlI#AE~IcswdkUZKU8i4Z~nJCY82u%3)VS-z2%dTIck5kwXtzPsZHbc zD%qKoo1izLr!?uMKL*!@I8~1;3Ae_ZSr*@}wULl;kRm;Q zwTn}tYE<=0T4Si6oSC&YzrGnG*YjxG9vFpI*ZV4qOu){UT~OS-=iIp9$XS%nMSWr~ zH#e?8p%rvlWtKNlO%Dt>Zbh^D_1db&rjM10e7;1{&tcy9kEqgHT|d=HcI3#pOx|?f zdE&K2bZTKIaREY4CxKm@!|Gb!Q@dH0@5ZpPRKU6(?#`9^;^1~e3@z1rh z>N@hr-F=_C@yEU&-b(RD=RS88`J?B^edhczbm9O1ga4noIWjNwB;-0EHOcJFinwlK zY<%;S+-RHck9=*Rl*c8DmVQ6-Y`d5K{rTVOvu58zFNLLDJRDZ*Xr3|iZtGmRL}%&w z2@0`6P19#aXtj}KIjm`qFfTpDaHra?mICwenv@B;er?{wE{wXRI@6(MgmTNplL3KO zuWPlF>?qzGwYDfOTc>V9P*YkNgJwElT`OPXf5L;Y97 z$rtstv|OEPLVdO%2GEPM3zvEL*21$=TeqsuK5cWo=BH|w!avE%bTZW4Sb|0At9&p z+TuX3$HW{U@UM+cMrH8N4NS15gVUIN_`m@Mb4YVrRm(7-T!Cr6s_AHI){6-ow3@kn zk(zE7HtE67M|uUt#~b1w*(RJIBMolvJJLF0%@gnGIy^YzEn5~-BhliTth$2ScpSwk z2XmW6=!;T`%HUGD^EBpvh-X)0V-1J~$7EzzURUKuA##^3UFt6CaLU+6MOFdGAjo1T zQwrVtHdvzN!--Oxfb*QH;7Q8lmEHHN&8&Z@Eu+CKb@uhOdxN7s4lK)y%elGapsQ;p zX4!!#RyZ@P1gQN~PT4KFr3)7xwtdF%OTB{%(XoV~QnHMPS>)S}_mh)NfQdh5kKT0l z!*~e^-%h5ZB(353gGOk)fDZ3FWJm}^!2P5oW03aD5pI{bMw03Z6i_#F%JibGuD(*o zl2yz*F4xg1fnCXhVi=);`vc!&F?Re0avrC~>t3KaqNru6S5q<9%H6hkkq?K*X&`5v zuc0w9tNU*$g-ba;5a~MkcY?;5X_i+uE|2hO`Bpe^ve98QdBJe{$_$)v4Kg8FCg&>A zqEYjw9Z}5lr>`HQth@^K^AbwH+u693J=P^^_OOYcxNd;Ud1egr2l>pfUBa+warnEL zfCwRwtxX&ue@X^3fnv^HIG*_SQ>bNLM#g0tGm(*%EZ#Va{Em-TcvzU{^jx-&e!qk;i;o>@w5_E zG5JkecpPVrAgi>$t0>onO#mzULO?$y>6`!)y&?3~6qC&H)KkU~3^=Cucy;SVT8{Kq z2Nj?7k(^cI{mZrsDNj%DT@InZIh9kVO!)ll8&hva z19>c8vSeMba@Iq+UnC^XO9~5Z>)Mo>>+zVDo#Z(YFLXP}?E_QR7=jN!^SGqCs3{6SH)@lWHU6ZPUb87WG*L9NnIk0Uid1az97)C&i0elWA1)>> zp?#ql3J_f^fJG+rmhWw1g7%*djxHXHAP%XF7Ptbt1{6LD)IDgy1W)>ClP$9m+bjb( zIIFeEr*L_X4bbCfrfhLz_Tocjy%mEqq9GAc<8qy%s7oU^o5hqVe83Ef>?VdGm@FNk z!6uEve<}o%pb~JaV_7BPgT`ojD=io1{iKUaB55@_@k)69byromz=MZNUH7uCIq@wu z3*=Qh%fRvo%Bc`yJ`LE|Y13?He+z%N?q}|r^P!)~3UFX_Z%bCJIE698RpD!l`NY`q z<4+{MT}1PZDa`VvOV=wK5V|v%P_4p;;B+`M*q$M1mqJLTB4=N_wh(;B?UIyPik>ardsa1y-v#~!GIuJyDIX^JKsJ%bKQ8``MIx~{ zax`h0n;k~G$2{RuK0psg0l0b@4Y&q2vj;T5c=h=VLeQA~*g0)&9T--$b{jWs zTHuDlBpB!`5Tt>6g{yVXHS>_kg){&kHbbG09W&;*4CG4@Lo&-~Aek=pL+FsYeVH%FA_upNaP64AoUcaUqIelY z&RSCY%$E0FdcMQ4G4YvLD5HTi`C5H@^*S%c1%M&>v5(yjD=WXb6Ti$z9D7!NxTe%< zL2e1nY6$ZYJfJP8?!NAvA<}~|j+y4I1-LPqE*gBqShZv}i472q!AQk8o-sQ+@ll6jtxDUJlVfQf9cYT%y-Qe>4d7ony%Uu zsR}j1uOW^UEl{$ zL)-#no|f%9{2`zvdzL8-tjCm0Uq>!h@X{oEr_uGEJbikM2I)9r&?_C}Eu_{H-rhlA zamF~B+QCj+;owpgRfEl9I5>15B^FSy7MP&`R#^jz0l^ijqLF-a;bp?E1W^`4WfQ!M z!HLDU>6(~|uE838(1XIt4y6}r7(H?Wz=C(Nf>$XCGfFv!A;Xk7FhVXQ3qU$(!9u5m z)m$WHgwcZ8=G?{x^02_WR{G7o#5UZ50gB#@b-&46_4QR{w~6h$ef!O*;DCTf4$8-P z;-Y|{X8Xam3=A0&#}wv+tZi%rh^^vdp1vx7cWNcwpB(38Tx6i`i1hRoZ2SncYF8=e zL;=TcBbsDKS#C;|eix$}xyK~G(Jca2KQf3_%i+tDrq;*08mW^Qjx zDYA0;(0@=XBqL|Sj$&lMG5fF_1+;|3FXqbm?GN0MD(?Tl;>dn8`K-ttpS#!WJN0(1 zz;z0rmf7^_zMn%>_I-QdvxwSZvZu+Q@;9L4($?5>!dy}aETB4wJG-kPuM0VSC5~UnA_DP^_HtWvqEgE8l~-ZUB^1aE=Sdu^_7BdYS5#OqG6x|KNt#fqpq&*W6e+Ap0`%gh3i3{VqKg*##_ZP`dMVAZ$B@wUB z-BGJ}Dtd_W%NH-!Ws0wI{Mo=udo!*TjjpUw9I`b_ z|HrRk?rTQ$yNOh`T&a(huh!zYASyxQ`aPOo4K;(apiU< zznAN-3DU2w9m#*bJ+I%`61|dkN9;XKN1g8{Irp>a4qjdpRy?7deu>(E+Ip7-W9rNz zs%4gZ{(g6Rk1y=lXRCL(k+godtA#nnzV5Bp^y~H4CPBK%cZ}QBI4mf&;I%hj*LQms zr(1ZfU=6KF+k_43KMoH2;T@kIIcR0O(B;?b@1)x$wNcJr(lX4T*#76%U)$y6?!6g7 z;d$%5tZ(jLyDvVmPwV@uJPz>k)RLE_^{4h!*y#7@d`qlP$!^zPDS9q4xn^Cma^T&I z9qrps7jUV3cD2XeAj`~c+CkbW5q%>g6NYx@<-qFF&*R#dE#O6N1W*v#VPH``NJ_v@~(DX4nO^Z{Eti(4tzKeK19zJJu3>Xsf= YOJ}V(oI69CmnAgjXw43uwPw%%0vmd7WdHyG literal 40873 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 O%|*)=M$O;+)Bgc+4?>#& diff --git a/examples/select_directory/screenshot.png b/examples/select_directory/screenshot.png index f370a4c45f6359281c1655d0439d0d93828f1839..cf313cf1176e7f11e82ef16fe0b9adb2e567979d 100644 GIT binary patch literal 36146 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 F{|9^kP(1(u literal 40652 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 Date: Sat, 3 Feb 2024 15:40:20 +0100 Subject: [PATCH 121/124] Fix rusfmt error --- src/file_dialog.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index dae67366..06fa5540 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -378,7 +378,12 @@ impl FileDialog { 1.0, ctx.style().visuals.window_stroke.color, )) - .inner_margin(egui::Margin{ left: 4.0, right: 8.0, top: 4.0, bottom: 4.0 }) + .inner_margin(egui::Margin { + left: 4.0, + right: 8.0, + top: 4.0, + bottom: 4.0, + }) .rounding(egui::Rounding::from(4.0)) .show(ui, |ui| { ui.style_mut().always_scroll_the_only_direction = true; From 87075134cae0740a737264deaaf824b7ecc36fa0 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 15:45:59 +0100 Subject: [PATCH 122/124] Update UI of current path display --- src/file_dialog.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 06fa5540..5ac36532 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -434,7 +434,9 @@ impl FileDialog { ui.label(">"); } - if ui.button(file_name).clicked() { + let is_last = data.components().count() - 1 == i; + + if ui.selectable_label(is_last, file_name).clicked() { let _ = self.load_directory(path.as_path()); return; } From 9bdf44fa78e0f4bb4d040b03062755c0ffa82cb0 Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 15:50:36 +0100 Subject: [PATCH 123/124] Update example images --- doc/img/demo.png | Bin 41041 -> 38653 bytes examples/save_file/screenshot.png | Bin 41505 -> 41466 bytes examples/select_directory/screenshot.png | Bin 36146 -> 36273 bytes examples/select_file/screenshot.png | Bin 41398 -> 41529 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/img/demo.png b/doc/img/demo.png index 8465cc743b8cc44f2f01ab503d46afe8c94b9498..05a3352d80ba59958d183262afd3eea6c20d0a50 100644 GIT binary patch literal 38653 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

FbhxXc&z~k4}cJjI(o& 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 NdRRp+>(Ge{{|9uP$dCX4 literal 41041 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 YOJ}V(oI69CmnAgjXw43uwPw%%0vmd7WdHyG diff --git a/examples/select_directory/screenshot.png b/examples/select_directory/screenshot.png index cf313cf1176e7f11e82ef16fe0b9adb2e567979d..26128898438a214245b97a9442d764d0715c0aa9 100644 GIT binary patch literal 36273 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 BfY|^5 literal 36146 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 F{|9^kP(1(u From 2c50ea44dd2609500e2daaf6642a6b6fd79019dd Mon Sep 17 00:00:00 2001 From: FluxxCode Date: Sat, 3 Feb 2024 15:57:22 +0100 Subject: [PATCH 124/124] Fix typo --- src/file_dialog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_dialog.rs b/src/file_dialog.rs index 5ac36532..642b6368 100644 --- a/src/file_dialog.rs +++ b/src/file_dialog.rs @@ -825,7 +825,7 @@ impl FileDialog { full_path.push(self.file_name_input.as_str()); if full_path.is_dir() { - return Some("A directory the name already exists".to_string()); + return Some("A directory with the name already exists".to_string()); } if full_path.is_file() { return Some("A file with the name already exists".to_string());