From 897b50fe3506d2e46b143a1c0fcd6b65ee042875 Mon Sep 17 00:00:00 2001 From: firewire Date: Thu, 19 Mar 2026 01:52:51 -0400 Subject: [PATCH] Side panel --- src/app.rs | 123 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 43 deletions(-) diff --git a/src/app.rs b/src/app.rs index dbc683b..4c65681 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,5 +1,5 @@ -use eframe::egui; use crate::types; +use eframe::egui; use tokio::sync::mpsc; pub struct Application { @@ -7,6 +7,9 @@ pub struct Application { server_url: String, query: String, status: String, + + show_side_panel: bool, + search_ctx: types::SearchContext, } @@ -18,6 +21,69 @@ impl Application { Self::default() } + fn render_top(&mut self, ctx: &egui::Context) { + egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { + ui.horizontal(|ui| { + let mut side_panel_btn_text = ">>"; + if self.show_side_panel { + side_panel_btn_text = "<<"; + } + if ui.button(side_panel_btn_text).clicked() { + self.show_side_panel = !self.show_side_panel; + } + + ui.separator(); + + // Search button and input + ui.label("Search: "); + if ui.text_edit_singleline(&mut self.query).lost_focus() + && ui.input(|i| i.key_pressed(egui::Key::Enter)) + { + let query = self.query.clone(); + let url = self.server_url.clone(); + let page = self.search_ctx.page.clone(); + let page_size = self.search_ctx.per_page.clone(); + let (tx, rx) = mpsc::channel::< + Result<(Vec, types::Metadata), String>, + >(1); + + self.search_ctx.search_rx = Some(rx); + self.search_ctx.is_searching = true; + self.search_ctx.search_results.clear(); + self.search_ctx.page = 0; + self.search_ctx.total_pages = 0; + self.search_ctx.total_results = 0; + self.status = "Searching...".to_string(); + tokio::spawn(async move { + let res = search_files(url, query, page, page_size).await; + let _ = tx.send(res).await; + }); + } + ui.separator(); + + ui.label(&self.status); + }); + }); + } + + fn render_side_panel(&mut self, ctx: &egui::Context) { + egui::SidePanel::left("left_panel").show(ctx, |ui| { + ui.horizontal(|ui| { + ui.label("API Url: "); + ui.text_edit_singleline(&mut self.server_url); + }); + ui.horizontal(|ui| { + ui.label("Save location: "); + ui.label(self.download_path.as_deref().unwrap_or("None")); + if ui.button("Browse").clicked() { + if let Some(path) = rfd::FileDialog::new().pick_folder() { + self.download_path = Some(path.display().to_string()); + } + } + }); + }); + } + fn process_channels(&mut self, ctx: &egui::Context) { if self.search_ctx.search_rx.is_some() { let mut clear_rx = false; @@ -32,16 +98,16 @@ impl Application { self.search_ctx.per_page = results.1.page_size; self.search_ctx.is_searching = false; clear_rx = true; - }, + } Ok(Err(e)) => { // Ok recv, err results self.status = format!("Search failed: {}", e); self.search_ctx.is_searching = false; clear_rx = true; - }, + } Err(mpsc::error::TryRecvError::Empty) => { ctx.request_repaint(); - }, + } Err(mpsc::error::TryRecvError::Disconnected) => { self.status = "Search thread ended unexpectedly".to_string(); self.search_ctx.is_searching = false; @@ -49,8 +115,10 @@ impl Application { } } } - if clear_rx { self.search_ctx.search_rx = None; } - } + if clear_rx { + self.search_ctx.search_rx = None; + } + } } } @@ -62,48 +130,18 @@ impl Default for Application { query: "".to_string(), status: "Ready!".to_string(), search_ctx: types::SearchContext::default(), + show_side_panel: false, } } } impl eframe::App for Application { - fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { - + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { self.process_channels(ctx); - - egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { - ui.horizontal(|ui| { - - // Search button and input - ui.label("Search: "); - if ui.text_edit_singleline(&mut self.query).lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)) { - - let query = self.query.clone(); - let url = self.server_url.clone(); - let page = self.search_ctx.page.clone(); - let page_size = self.search_ctx.per_page.clone(); - let (tx, rx) = mpsc::channel::, types::Metadata), String>>(1); - - self.search_ctx.search_rx = Some(rx); - self.search_ctx.is_searching = true; - self.search_ctx.search_results.clear(); - self.search_ctx.page = 0; - self.search_ctx.total_pages = 0; - self.search_ctx.total_results = 0; - self.status = "Searching...".to_string(); - tokio::spawn(async move { - let res = search_files(url, query, page, page_size).await; - let _ = tx.send(res).await; - - }); - } - ui.separator(); - - ui.label(&self.status); - - }); - }); - + self.render_top(ctx); + if self.show_side_panel { + self.render_side_panel(ctx); + } egui::CentralPanel::default().show(ctx, |ui| { ui.heading("Hello world"); }); @@ -150,4 +188,3 @@ async fn search_files( Ok((results.results, results.metadata)) } -