Skip to content

Commit

Permalink
Merge 4a85cd1 into 460c80f
Browse files Browse the repository at this point in the history
  • Loading branch information
Eliot00 committed Jan 2, 2022
2 parents 460c80f + 4a85cd1 commit 1d061b0
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 12 deletions.
69 changes: 64 additions & 5 deletions quake_tui/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use quake_core::entry::entry_paths::EntryPaths;
use quake_core::usecases::entry_usecases;
use quake_core::QuakeConfig;
use tui::backend::Backend;
use tui::widgets::ListState;
use tui::Terminal;

use crate::entry_action::action_result_to_main_widget;
Expand Down Expand Up @@ -99,13 +100,14 @@ impl App {
match self.state.mode {
Mode::Normal => match key_code {
KeyCode::Char(':') => {
self.collect_command();
self.message_clear();
self.state.mode = Mode::Command;
self.into_command_mode();
}
KeyCode::Char('i') => {
self.state.mode = Mode::Insert;
}
KeyCode::Char('j') => self.entry_next(),
KeyCode::Char('k') => self.entry_prev(),
KeyCode::Char('a') => self.action_auto_complete(),
_ => {}
},
Mode::Command => match key_code {
Expand Down Expand Up @@ -155,8 +157,11 @@ impl App {
"listAll" => {
let entry_defines_path =
Path::new(&self.config.workspace).join(EntryPaths::entries_define());
self.main_widget =
MainWidget::EntryTypes(entry_defines::from_path(&entry_defines_path));
let defines = entry_defines::from_path(&entry_defines_path);
if !defines.is_empty() {
self.state.entry_list_state.select(Some(0));
}
self.main_widget = MainWidget::EntryTypes(defines);
}
"save" => self.save_entry(),
other => {
Expand All @@ -167,12 +172,65 @@ impl App {

Ok(())
}

pub fn entry_next(&mut self) {
if let MainWidget::EntryTypes(defines) = &self.main_widget {
let len = defines.len();
let i = match self.state.entry_list_state.selected() {
Some(i) => {
if i >= len - 1 {
0
} else {
i + 1
}
}
None => 0,
};
self.state.entry_list_state.select(Some(i));
}
}

pub fn entry_prev(&mut self) {
if let MainWidget::EntryTypes(defines) = &self.main_widget {
let len = defines.len();
let i = match self.state.entry_list_state.selected() {
Some(i) => {
if i == 0 {
len - 1
} else {
i - 1
}
}
None => 0,
};
self.state.entry_list_state.select(Some(i));
}
}

fn action_auto_complete(&mut self) {
if let MainWidget::EntryTypes(defines) = &self.main_widget {
if let Some(idx) = self.state.entry_list_state.selected() {
let entry_type = defines[idx].entry_type.clone();
self.into_command_mode();
for ch in entry_type.chars() {
self.input_push(ch);
}
}
}
}

fn into_command_mode(&mut self) {
self.collect_command();
self.message_clear();
self.state.mode = Mode::Command;
}
}

pub struct AppState {
running: bool,
pub mode: Mode,
input: String,
pub entry_list_state: ListState,
}

impl Default for AppState {
Expand All @@ -181,6 +239,7 @@ impl Default for AppState {
running: true,
mode: Mode::Normal,
input: "".to_string(),
entry_list_state: ListState::default(),
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion quake_tui/src/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub fn draw<B: Backend>(f: &mut Frame<B>, app: &mut App) {
.constraints([Constraint::Length(3), Constraint::Min(1)].as_ref())
.split(f.size());
f.render_widget(app.cmd_line.clone(), chunks[0]);
f.render_widget(app.main_widget.clone(), chunks[1]);
f.render_stateful_widget(app.main_widget.clone(), chunks[1], &mut app.state);

match app.state.mode {
Mode::Normal => {}
Expand Down
21 changes: 15 additions & 6 deletions quake_tui/src/widgets.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
use quake_core::entry::EntryDefine;
use tui::buffer::Buffer;
use tui::layout::{Alignment, Corner, Rect};
use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, List, ListItem, Paragraph, Widget};
use tui::widgets::{Block, Borders, List, ListItem, Paragraph, StatefulWidget, Widget};

use quake_core::entry::EntryDefine;
use crate::app::AppState;

#[derive(Clone, Debug, PartialEq)]
pub enum MainWidget {
Expand All @@ -17,8 +18,10 @@ pub enum MainWidget {
},
}

impl Widget for MainWidget {
fn render(self, area: Rect, buf: &mut Buffer) {
impl StatefulWidget for MainWidget {
type State = AppState;

fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) {
match self {
MainWidget::Home => {
let help_messages = vec![
Expand Down Expand Up @@ -59,9 +62,15 @@ impl Widget for MainWidget {
.collect();
let entry_types_list = List::new(entry_types)
.block(Block::default().borders(Borders::ALL).title("List"))
.start_corner(Corner::TopLeft);
.start_corner(Corner::TopLeft)
.highlight_style(
Style::default()
.bg(Color::LightCyan)
.add_modifier(Modifier::BOLD),
)
.highlight_symbol(">> ");

entry_types_list.render(area, buf);
StatefulWidget::render(entry_types_list, area, buf, &mut state.entry_list_state);
}
MainWidget::Editor { content, .. } => {
let editor = Paragraph::new(content.as_ref())
Expand Down

0 comments on commit 1d061b0

Please sign in to comment.