various fixes

pull/4/head
Jan Hrastnik 4 years ago
parent c9e9fcf7c5
commit 2b44031929

@ -239,7 +239,7 @@ impl Renderer {
pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) { pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) {
// completion // completion
if let Some(completion) = &prompt.completion { if !prompt.completion.is_empty() {
// TODO: find out better way of clearing individual lines of the screen // TODO: find out better way of clearing individual lines of the screen
for i in (3..7) { for i in (3..7) {
self.surface.set_string( self.surface.set_string(
@ -255,10 +255,10 @@ impl Renderer {
); );
let mut row = 0; let mut row = 0;
let mut col = 0; let mut col = 0;
let max_row: u16 = self.size.0 / BASE_WIDTH; let max_col: u16 = self.size.0 / BASE_WIDTH;
// TODO: this will crash if there are too many cols added // TODO: this will crash if there are too many cols added
// TODO: set char limit // TODO: set char limit
for (i, command) in completion.iter().enumerate() { for (i, command) in prompt.completion.iter().enumerate() {
let color = if prompt.completion_selection_index.is_some() let color = if prompt.completion_selection_index.is_some()
&& i == prompt.completion_selection_index.unwrap() && i == prompt.completion_selection_index.unwrap()
{ {
@ -267,18 +267,18 @@ impl Renderer {
self.text_color self.text_color
}; };
self.surface.set_stringn( self.surface.set_stringn(
1 + row * BASE_WIDTH, 1 + col * BASE_WIDTH,
self.size.1 - 6 + col as u16, self.size.1 - 6 + row as u16,
&command, &command,
BASE_WIDTH as usize - 1, BASE_WIDTH as usize - 1,
color, color,
); );
col += 1; row += 1;
if col > 3 { if row > 3 {
col = 0; row = 0;
row += 1; col += 1;
} }
if row > max_row { if col > max_col {
break; break;
} }
} }
@ -434,7 +434,6 @@ impl Application {
let prompt = Prompt::new( let prompt = Prompt::new(
":".to_owned(), ":".to_owned(),
|_input: &str| { |_input: &str| {
let mut matches = vec![];
// TODO: i need this duplicate list right now to avoid borrow checker issues // TODO: i need this duplicate list right now to avoid borrow checker issues
let command_list = vec![ let command_list = vec![
String::from("q"), String::from("q"),
@ -469,15 +468,10 @@ impl Application {
String::from("ddd"), String::from("ddd"),
String::from("eee"), String::from("eee"),
]; ];
for command in command_list { command_list
if command.contains(_input) { .into_iter()
matches.push(command); .filter(|command| command.contains(_input))
} .collect()
}
if matches.len() != 0 {
return Some(matches);
}
None
}, // completion }, // completion
|editor: &mut Editor, input: &str| match input { |editor: &mut Editor, input: &str| match input {
"q" => editor.should_close = true, "q" => editor.should_close = true,

@ -309,6 +309,10 @@ pub fn append_mode(view: &mut View, _count: usize) {
// TODO: I, A, o and O can share a lot of the primitives. // TODO: I, A, o and O can share a lot of the primitives.
pub fn command_mode(_view: &mut View, _count: usize) {
unimplemented!()
}
// calculate line numbers for each selection range // calculate line numbers for each selection range
fn selection_lines(state: &State) -> Vec<usize> { fn selection_lines(state: &State) -> Vec<usize> {
let mut lines = state let mut lines = state

@ -163,6 +163,7 @@ pub fn default() -> Keymaps {
vec![key!('p')] => commands::paste, vec![key!('p')] => commands::paste,
vec![key!('>')] => commands::indent, vec![key!('>')] => commands::indent,
vec![key!('<')] => commands::unindent, vec![key!('<')] => commands::unindent,
vec![key!(':')] => commands::command_mode,
vec![Key { vec![Key {
code: KeyCode::Esc, code: KeyCode::Esc,
modifiers: Modifiers::NONE modifiers: Modifiers::NONE

@ -6,17 +6,17 @@ pub struct Prompt {
pub prompt: String, pub prompt: String,
pub line: String, pub line: String,
pub cursor: usize, pub cursor: usize,
pub completion: Option<Vec<String>>, pub completion: Vec<String>,
pub should_close: bool, pub should_close: bool,
pub completion_selection_index: Option<usize>, pub completion_selection_index: Option<usize>,
completion_fn: Box<dyn FnMut(&str) -> Option<Vec<String>>>, completion_fn: Box<dyn FnMut(&str) -> Vec<String>>,
callback_fn: Box<dyn FnMut(&mut Editor, &str)>, callback_fn: Box<dyn FnMut(&mut Editor, &str)>,
} }
impl Prompt { impl Prompt {
pub fn new( pub fn new(
prompt: String, prompt: String,
mut completion_fn: impl FnMut(&str) -> Option<Vec<String>> + 'static, mut completion_fn: impl FnMut(&str) -> Vec<String> + 'static,
callback_fn: impl FnMut(&mut Editor, &str) + 'static, callback_fn: impl FnMut(&mut Editor, &str) + 'static,
) -> Prompt { ) -> Prompt {
Prompt { Prompt {
@ -68,11 +68,11 @@ impl Prompt {
} }
pub fn change_completion_selection(&mut self) { pub fn change_completion_selection(&mut self) {
if self.completion.is_some() { if !self.completion.is_empty() {
self.completion_selection_index = self self.completion_selection_index = self
.completion_selection_index .completion_selection_index
.map(|i| { .map(|i| {
if i == self.completion.as_ref().unwrap().len() - 1 { if i == self.completion.len() - 1 {
0 0
} else { } else {
i + 1 i + 1
@ -81,8 +81,6 @@ impl Prompt {
.or(Some(0)); .or(Some(0));
self.line = String::from( self.line = String::from(
self.completion self.completion
.as_ref()
.unwrap()
.get(self.completion_selection_index.unwrap()) .get(self.completion_selection_index.unwrap())
.unwrap(), .unwrap(),
); );

Loading…
Cancel
Save