From b748973384c0c1886ad3cf357278c1dab5a0f2a8 Mon Sep 17 00:00:00 2001 From: firewire Date: Thu, 19 Mar 2026 02:16:41 -0400 Subject: [PATCH] Page buttons --- src/app.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++-- src/main.rs | 1 + src/util.rs | 9 +++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/util.rs diff --git a/src/app.rs b/src/app.rs index 4c65681..6ff6d85 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,4 +1,5 @@ use crate::types; +use crate::util::clamp; use eframe::egui; use tokio::sync::mpsc; @@ -24,6 +25,7 @@ impl Application { fn render_top(&mut self, ctx: &egui::Context) { egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { ui.horizontal(|ui| { + // Side panel toggle let mut side_panel_btn_text = ">>"; if self.show_side_panel { side_panel_btn_text = "<<"; @@ -31,7 +33,6 @@ impl Application { if ui.button(side_panel_btn_text).clicked() { self.show_side_panel = !self.show_side_panel; } - ui.separator(); // Search button and input @@ -61,6 +62,57 @@ impl Application { } ui.separator(); + ui.label(format!( + "Page {} of {}", + self.search_ctx.page, self.search_ctx.total_pages + )); + if ui.button(" - ").clicked() { + self.search_ctx.page = + clamp(self.search_ctx.page - 1, 1, self.search_ctx.total_pages); + 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; + }); + ctx.forget_all_images(); + } + + if ui.button("+").clicked() { + self.search_ctx.page = + clamp(self.search_ctx.page + 1, 1, self.search_ctx.total_pages); + 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.label(&self.status); }); }); @@ -81,6 +133,23 @@ impl Application { } } }); + + ui.horizontal(|ui| { + // Page controls + ui.label(format!("Items per page: {}", self.search_ctx.per_page)); + if ui.button(" - ").clicked() { + self.search_ctx.per_page = self.search_ctx.per_page.saturating_sub(1); + self.search_ctx.total_pages = + self.search_ctx.total_results / self.search_ctx.per_page; + ctx.forget_all_images(); + } + if ui.button("+").clicked() { + self.search_ctx.per_page = self.search_ctx.per_page.saturating_add(1); + self.search_ctx.total_pages = + self.search_ctx.total_results / self.search_ctx.per_page; + ctx.forget_all_images(); + } + }); }); } @@ -143,7 +212,7 @@ impl eframe::App for Application { self.render_side_panel(ctx); } egui::CentralPanel::default().show(ctx, |ui| { - ui.heading("Hello world"); + ui.heading("// TODO: Put shit here"); }); } } diff --git a/src/main.rs b/src/main.rs index 7cd0194..1f795b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ mod app; mod types; +mod util; #[tokio::main] async fn main() { diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..619a5c1 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,9 @@ +pub fn clamp(val: usize, min: usize, max: usize) -> usize { + if val < min { + min + } else if val > max { + max + } else { + val + } +}