added search function

This commit is contained in:
Penwing 2024-01-22 13:43:39 +01:00
parent 5769965c6c
commit af1f57df36
4 changed files with 87 additions and 20 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "calcifer" name = "calcifer"
version = "0.1.0" version = "0.1.1"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -18,3 +18,4 @@ image = "0.24.8"
serde = { version = "1.0.195", features = ["derive"] } serde = { version = "1.0.195", features = ["derive"] }
serde_json = "1.0.111" serde_json = "1.0.111"

View file

@ -1 +1 @@
{"tabs":["/home/penwing/Documents/projects/rust/calcifer/src/main.rs","/home/penwing/Documents/notes/victory2.txt"],"theme":6} {"tabs":["/home/penwing/Documents/projects/rust/calcifer/src/main.rs","/home/penwing/Documents/notes/victory2.txt","/home/penwing/Documents/projects/rust/calcifer/src/tools/search.rs"],"theme":6}

View file

@ -8,7 +8,7 @@ pub mod search;
pub trait View { pub trait View {
fn ui(&mut self, ui: &mut egui::Ui); fn ui(&mut self, ui: &mut egui::Ui, tabs: &mut Vec<Tab>, selected_tab: &mut TabNumber);
} }
/// Something to view /// Something to view
@ -26,7 +26,7 @@ pub trait Demo {
} }
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq, Clone)]
pub enum TabNumber { pub enum TabNumber {
None, None,
Open, Open,

View file

@ -2,7 +2,17 @@ use eframe::egui;
use crate::tools::{View, Demo, Tab, TabNumber}; use crate::tools::{View, Demo, Tab, TabNumber};
enum Action {
Next,
Previous,
Replace,
None,
}
#[derive(Clone)]
pub struct Selection { pub struct Selection {
pub tab: TabNumber,
pub start: usize, pub start: usize,
pub end: usize, pub end: usize,
} }
@ -11,6 +21,7 @@ pub struct Selection {
impl Default for Selection { impl Default for Selection {
fn default() -> Self { fn default() -> Self {
Self { Self {
tab: TabNumber::Zero,
start: 0, start: 0,
end: 0, end: 0,
} }
@ -20,7 +31,9 @@ impl Default for Selection {
pub struct SearchWindow { pub struct SearchWindow {
search_text: String, search_text: String,
result: Selection, searched_text: String,
results: Vec<Selection>,
current_result: Selection,
across_documents: bool, across_documents: bool,
replace_text: String, replace_text: String,
} }
@ -30,7 +43,9 @@ impl Default for SearchWindow {
fn default() -> Self { fn default() -> Self {
Self { Self {
search_text: "".into(), search_text: "".into(),
result: Selection::default(), searched_text: "".into(),
results: vec![],
current_result: Selection::default(),
across_documents: false, across_documents: false,
replace_text: "".into(), replace_text: "".into(),
} }
@ -48,29 +63,35 @@ impl Demo for SearchWindow {
.open(open) .open(open)
.vscroll(true) .vscroll(true)
.hscroll(true) .hscroll(true)
.show(ctx, |ui| self.ui(ui)); .show(ctx, |ui| self.ui(ui, tabs, selected_tab));
} }
} }
impl View for SearchWindow { impl View for SearchWindow {
fn ui(&mut self, ui: &mut egui::Ui) { fn ui(&mut self, ui: &mut egui::Ui, tabs: &mut Vec<Tab>, selected_tab: &mut TabNumber) {
ui.set_min_width(250.0); ui.set_min_width(250.0);
let mut action : Action = Action::None;
ui.horizontal(|ui| { ui.horizontal(|ui| {
let Self { search_text, .. } = self; let Self { search_text, .. } = self;
ui.add(egui::TextEdit::singleline(search_text).desired_width(120.0).lock_focus(true)); ui.add(egui::TextEdit::singleline(search_text).desired_width(120.0).lock_focus(true));
if ui.add(egui::Button::new("<")).clicked() { ui.label(format!("{} ", self.results.len()));
self.find_previous();
}
if ui.add(egui::Button::new(">")).clicked() { if ui.add(egui::Button::new("<")).clicked() {
self.find_next(); action = Action::Previous;
} else if ui.add(egui::Button::new(">")).clicked() {
action = Action::Next;
} }
}); });
let previous_bool_state = self.across_documents.clone();
ui.checkbox(&mut self.across_documents, "Across documents"); ui.checkbox(&mut self.across_documents, "Across documents");
if previous_bool_state != self.across_documents {
self.searched_text = "".into();
}
egui::CollapsingHeader::new("Replace") egui::CollapsingHeader::new("Replace")
.default_open(false) .default_open(false)
@ -79,23 +100,68 @@ impl View for SearchWindow {
let Self { replace_text, .. } = self; let Self { replace_text, .. } = self;
ui.add(egui::TextEdit::singleline(replace_text).desired_width(120.0).lock_focus(true)); ui.add(egui::TextEdit::singleline(replace_text).desired_width(120.0).lock_focus(true));
if ui.add(egui::Button::new("Replace")).clicked() { if ui.add(egui::Button::new("Replace")).clicked() {
self.replace_text(); action = Action::Replace;
} }
}); });
}); });
match action {
Action::Next => self.find_next(tabs, selected_tab),
Action::Previous => self.find_previous(tabs, selected_tab),
Action::Replace => self.replace(tabs, selected_tab),
Action::None => (),
}
} }
} }
impl SearchWindow { impl SearchWindow {
fn find_previous(&self) { fn search(&mut self, tabs: &Vec<Tab>, selected_tab: &TabNumber) {
println!("Searched for previous"); let mut search_results: Vec<Selection> = vec![];
if self.across_documents {
for (index, tab) in tabs.iter().enumerate() {
search_results.extend(self.match_text(tab.code.clone(), TabNumber::from_index(index)));
}
} else {
search_results.extend(self.match_text(tabs[TabNumber::to_index(&selected_tab.clone())].code.clone(), selected_tab.clone()));
} }
fn find_next(&self) { println!("Found {} results", search_results.len());
println!("Searched for next"); self.searched_text = self.search_text.clone();
self.results = search_results.clone();
if self.results.len() > 0 {
self.current_result = self.results[0].clone();
}
} }
fn replace_text(&self) { fn match_text(&self, tab_text: String, tab_number: TabNumber) -> Vec<Selection> {
let matches = tab_text.match_indices(&self.search_text.clone()).map(|(i, _)| Selection {
tab : tab_number.clone(),
start: i,
end: i + self.search_text.len(),
}).collect();
matches
}
fn find_next(&mut self, tabs: &Vec<Tab>, selected_tab: &TabNumber) {
if self.searched_text != self.search_text && self.search_text.len() > 1 {
self.search(tabs, selected_tab);
} else {
println!("just need to get next result");
}
}
fn find_previous(&mut self, tabs: &Vec<Tab>, selected_tab: &TabNumber) {
if self.searched_text != self.search_text && self.search_text.len() > 1 {
self.search(tabs, selected_tab);
} else {
println!("just need to get next result");
}
}
fn replace(&mut self, tabs: &Vec<Tab>, selected_tab: &TabNumber) {
println!("Searched to replace {} with {}", &self.search_text, &self.replace_text); println!("Searched to replace {} with {}", &self.search_text, &self.replace_text);
} }
} }