Added wrap around feature to find menu
This commit is contained in:
parent
a23a95b609
commit
5070f0c696
4 changed files with 33 additions and 3 deletions
|
|
@ -61,6 +61,7 @@ replace = Replace
|
|||
replace-all = Replace all
|
||||
case-sensitive = Case sensitive
|
||||
use-regex = Use regex
|
||||
wrap-around = Wrap Around
|
||||
|
||||
# Menu
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ pub struct Config {
|
|||
pub auto_indent: bool,
|
||||
pub find_case_sensitive: bool,
|
||||
pub find_use_regex: bool,
|
||||
pub find_wrap_around: bool,
|
||||
pub font_name: String,
|
||||
pub font_size: u16,
|
||||
pub highlight_current_line: bool,
|
||||
|
|
@ -59,6 +60,7 @@ impl Default for Config {
|
|||
auto_indent: true,
|
||||
find_case_sensitive: false,
|
||||
find_use_regex: false,
|
||||
find_wrap_around: true,
|
||||
font_name: "Fira Mono".to_string(),
|
||||
font_size: 14,
|
||||
highlight_current_line: true,
|
||||
|
|
|
|||
15
src/main.rs
15
src/main.rs
|
|
@ -337,6 +337,7 @@ pub enum Message {
|
|||
FindReplaceValueChanged(String),
|
||||
FindSearchValueChanged(String),
|
||||
FindUseRegex(bool),
|
||||
FindWrapAround(bool),
|
||||
Focus,
|
||||
GitProjectStatus(Vec<(String, PathBuf, Vec<GitStatus>)>),
|
||||
GitStage(PathBuf, PathBuf),
|
||||
|
|
@ -1708,7 +1709,7 @@ impl Application for App {
|
|||
//TODO: do not compile find regex on every search?
|
||||
match self.config.find_regex(&self.find_search_value) {
|
||||
Ok(regex) => {
|
||||
tab.search(®ex, true);
|
||||
tab.search(®ex, true, self.config.find_wrap_around);
|
||||
}
|
||||
Err(err) => {
|
||||
//TODO: put regex error in find box
|
||||
|
|
@ -1731,7 +1732,7 @@ impl Application for App {
|
|||
//TODO: do not compile find regex on every search?
|
||||
match self.config.find_regex(&self.find_search_value) {
|
||||
Ok(regex) => {
|
||||
tab.search(®ex, false);
|
||||
tab.search(®ex, false, self.config.find_wrap_around);
|
||||
}
|
||||
Err(err) => {
|
||||
//TODO: put regex error in find box
|
||||
|
|
@ -1812,6 +1813,10 @@ impl Application for App {
|
|||
self.config.find_use_regex = find_use_regex;
|
||||
return self.save_config();
|
||||
}
|
||||
Message::FindWrapAround(find_wrap_around) => {
|
||||
self.config.find_wrap_around = find_wrap_around;
|
||||
return self.save_config();
|
||||
}
|
||||
Message::GitProjectStatus(project_status) => {
|
||||
self.git_project_status = Some(project_status);
|
||||
}
|
||||
|
|
@ -2855,6 +2860,12 @@ impl Application for App {
|
|||
Message::FindUseRegex,
|
||||
)
|
||||
.into(),
|
||||
widget::checkbox(
|
||||
fl!("wrap-around"),
|
||||
self.config.find_wrap_around,
|
||||
Message::FindWrapAround,
|
||||
)
|
||||
.into(),
|
||||
])
|
||||
.align_items(Alignment::Center)
|
||||
.padding(space_xxs)
|
||||
|
|
|
|||
18
src/tab.rs
18
src/tab.rs
|
|
@ -245,10 +245,12 @@ impl EditorTab {
|
|||
}
|
||||
|
||||
// Code adapted from cosmic-text ViEditor search
|
||||
pub fn search(&self, regex: &Regex, forwards: bool) -> bool {
|
||||
pub fn search(&self, regex: &Regex, forwards: bool, wrap_around: bool) -> bool {
|
||||
let mut editor = self.editor.lock().unwrap();
|
||||
let mut cursor = editor.cursor();
|
||||
let mut wrapped = false; // Keeps track of whether the search has wrapped around yet.
|
||||
let start_line = cursor.line;
|
||||
|
||||
if forwards {
|
||||
while cursor.line < editor.with_buffer(|buffer| buffer.lines.len()) {
|
||||
if let Some(index) = editor.with_buffer(|buffer| {
|
||||
|
|
@ -269,6 +271,13 @@ impl EditorTab {
|
|||
}
|
||||
|
||||
cursor.line += 1;
|
||||
|
||||
// If we haven't wrapped yet and we've reached the last line, reset cursor line to 0 and
|
||||
// set wrapped to true so we don't wrap again
|
||||
if wrap_around && !wrapped && cursor.line == editor.with_buffer(|buffer| buffer.lines.len()) {
|
||||
cursor.line = 0;
|
||||
wrapped = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cursor.line += 1;
|
||||
|
|
@ -291,6 +300,13 @@ impl EditorTab {
|
|||
editor.set_cursor(cursor);
|
||||
return true;
|
||||
}
|
||||
|
||||
// If we haven't wrapped yet and we've reached the first line, reset cursor line to the
|
||||
// last line and set wrapped to true so we don't wrap again
|
||||
if wrap_around && !wrapped && cursor.line == 0 {
|
||||
cursor.line = editor.with_buffer(|buffer| buffer.lines.len());
|
||||
wrapped = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
false
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue