use egui::{Context, Event, Key, Modifiers};
use crate::command::Command;
use crate::mode::Mode;
pub fn process(
ctx: &Context,
mode: &Mode,
edit_buffer: &str,
is_prop_focused: bool,
) -> Option<Command> {
ctx.input_mut(|i| translate(i, mode, edit_buffer, is_prop_focused))
}
fn translate(
i: &mut egui::InputState,
mode: &Mode,
edit_buffer: &str,
is_prop_focused: bool,
) -> Option<Command> {
let ctrl = i.modifiers.ctrl || i.modifiers.mac_cmd;
let shift = i.modifiers.shift;
if mode != &Mode::Help {
if consume(i, ctrl, shift, false, Key::H) && matches!(mode, Mode::Command) {
} else if i.consume_key(Modifiers::NONE, Key::F1) {
return Some(Command::OpenHelp);
}
}
match mode {
Mode::Normal if !is_prop_focused => normal_mode(i, ctrl, shift),
Mode::Normal if is_prop_focused => prop_normal(i, ctrl),
Mode::Editing => editing_mode(i, ctrl, edit_buffer),
Mode::FormulaTree => formula_tree_mode(i),
Mode::FormulaName => formula_name_mode(i),
Mode::FormulaArgs => formula_args_mode(i, edit_buffer),
Mode::Command => command_mode(i),
Mode::CommandArgs { .. } => command_mode(i),
Mode::Help => {
if i.consume_key(Modifiers::NONE, Key::Escape)
|| i.consume_key(Modifiers::COMMAND, Key::W)
|| i.consume_key(egui::Modifiers::COMMAND | Modifiers::SHIFT, Key::Slash)
{
return Some(Command::CloseHelp);
}
None
}
_ => None,
}
}
fn normal_mode(i: &mut egui::InputState, ctrl: bool, _shift: bool) -> Option<Command> {
if i.consume_key(Modifiers::COMMAND, Key::Z) { return Some(Command::Undo); }
if i.consume_key(Modifiers::COMMAND | Modifiers::SHIFT, Key::Z) { return Some(Command::Redo); }
if consume(i, ctrl, false, false, Key::ArrowUp) { return Some(Command::MoveFirstTick); }
if consume(i, ctrl, false, false, Key::ArrowDown) { return Some(Command::MoveLastTick); }
if consume(i, ctrl, false, false, Key::ArrowLeft) { return Some(Command::MoveFirstCol); }
if consume(i, ctrl, false, false, Key::ArrowRight) { return Some(Command::MoveLastCol); }
if consume(i, ctrl, false, false, Key::Home) { return Some(Command::MoveFirstCol); }
if consume(i, ctrl, false, false, Key::End) { return Some(Command::MoveLastCol); }
if i.consume_key(Modifiers::NONE, Key::ArrowUp) { return Some(Command::MoveUp); }
if i.consume_key(Modifiers::NONE, Key::ArrowDown) { return Some(Command::MoveDown); }
if i.consume_key(Modifiers::NONE, Key::ArrowLeft) { return Some(Command::MoveLeft); }
if i.consume_key(Modifiers::NONE, Key::ArrowRight) { return Some(Command::MoveRight); }
if i.consume_key(Modifiers::NONE, Key::Home) { return Some(Command::MoveFirstTick); }
if i.consume_key(Modifiers::NONE, Key::End) { return Some(Command::MoveLastTick); }
if i.consume_key(Modifiers::NONE, Key::PageUp) { return Some(Command::PageUp); }
if i.consume_key(Modifiers::NONE, Key::PageDown) { return Some(Command::PageDown); }
if i.consume_key(Modifiers::NONE, Key::CloseBracket) { return Some(Command::NextSheet); }
if i.consume_key(Modifiers::NONE, Key::OpenBracket) { return Some(Command::PrevSheet); }
for (n, key) in [(1, Key::Num1),(2,Key::Num2),(3,Key::Num3),(4,Key::Num4),(5,Key::Num5),
(6,Key::Num6),(7,Key::Num7),(8,Key::Num8),(9,Key::Num9)] {
if i.consume_key(Modifiers::COMMAND, key) { return Some(Command::GoToSheet(n - 1)); }
}
if i.consume_key(Modifiers::NONE, Key::Delete) { return Some(Command::DeleteCell); }
if i.consume_key(Modifiers::NONE, Key::Backspace) { return Some(Command::DeleteCell); }
if i.consume_key(Modifiers::NONE, Key::F2) { return Some(Command::StartEditKeepValue); }
if i.consume_key(Modifiers::NONE, Key::F4) { return Some(Command::RepeatLastCommand); }
if i.consume_key(Modifiers::NONE, Key::Plus) { return Some(Command::PeriodIncrease); }
if i.consume_key(Modifiers::NONE, Key::Minus) { return Some(Command::PeriodDecrease); }
if i.consume_key(Modifiers::NONE, Key::Tab) { return Some(Command::FocusPropertyPanel); }
if i.consume_key(Modifiers::NONE, Key::Enter) { return Some(Command::StartEdit); }
if i.consume_key(Modifiers::COMMAND | Modifiers::SHIFT, Key::Slash) { return Some(Command::OpenHelp); }
if i.consume_key(Modifiers::COMMAND, Key::Y) { return Some(Command::Redo); }
if i.consume_key(Modifiers::COMMAND, Key::S) { return Some(Command::Save); }
for event in i.events.iter() {
if let Event::Text(text) = event {
if text == "=" {
i.events.clear();
return Some(Command::StartFormula);
}
if text == ":" {
i.events.clear();
return Some(Command::TypeChar(':'));
}
if text == "+" {
i.events.clear();
return Some(Command::PeriodIncrease);
}
if text == "-" {
i.events.clear();
return Some(Command::PeriodDecrease);
}
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn prop_normal(i: &mut egui::InputState, _ctrl: bool) -> Option<Command> {
if i.consume_key(Modifiers::NONE, Key::ArrowUp) { return Some(Command::PropMoveUp); }
if i.consume_key(Modifiers::NONE, Key::ArrowDown) { return Some(Command::PropMoveDown); }
if i.consume_key(Modifiers::NONE, Key::Delete) { return Some(Command::PropDeleteSelected); }
if i.consume_key(Modifiers::NONE, Key::Escape) { return Some(Command::FocusGrid); }
if i.consume_key(Modifiers::NONE, Key::Tab) { return Some(Command::FocusGrid); }
if i.consume_key(Modifiers::NONE, Key::Enter) { return Some(Command::PropStartEdit); }
if i.consume_key(Modifiers::NONE, Key::CloseBracket) { return Some(Command::NextSheet); }
if i.consume_key(Modifiers::NONE, Key::OpenBracket) { return Some(Command::PrevSheet); }
if i.consume_key(Modifiers::NONE, Key::Equals) { return Some(Command::PropStartFormula); }
for event in i.events.iter() {
if let Event::Text(text) = event {
if text == "=" {
i.events.clear();
return Some(Command::PropStartFormula);
}
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn editing_mode(i: &mut egui::InputState, _ctrl: bool, edit_buffer: &str) -> Option<Command> {
if i.consume_key(Modifiers::NONE, Key::Escape) { return Some(Command::Cancel); }
if i.consume_key(Modifiers::NONE, Key::Backspace) { return Some(Command::Backspace); }
if i.consume_key(Modifiers::NONE, Key::Delete) { return Some(Command::DeleteBuffer); }
if i.consume_key(Modifiers::NONE, Key::ArrowUp) { return Some(Command::Confirm); }
if i.consume_key(Modifiers::NONE, Key::ArrowDown) { return Some(Command::Confirm); }
if i.consume_key(Modifiers::NONE, Key::Tab) { return Some(Command::Confirm); }
if i.consume_key(Modifiers::NONE, Key::Enter) { return Some(Command::Confirm); }
if i.consume_key(Modifiers::NONE, Key::Space) { return Some(Command::TypeChar(' ')); }
if edit_buffer.is_empty() {
if i.consume_key(Modifiers::NONE, Key::Equals) { return Some(Command::TypeChar('=')); }
}
for event in i.events.iter() {
if let Event::Text(text) = event {
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn formula_tree_mode(i: &mut egui::InputState) -> Option<Command> {
if i.consume_key(Modifiers::NONE, Key::Escape) { return Some(Command::Cancel); }
if i.consume_key(Modifiers::NONE, Key::Backspace) { return Some(Command::Backspace); }
if i.consume_key(Modifiers::NONE, Key::Delete) { return Some(Command::DeleteBuffer); }
if i.consume_key(Modifiers::NONE, Key::Enter) { return Some(Command::Confirm); }
if i.consume_key(Modifiers::NONE, Key::ArrowLeft) { return Some(Command::MoveLeft); }
if i.consume_key(Modifiers::NONE, Key::ArrowRight){ return Some(Command::MoveRight); }
if i.consume_key(Modifiers::NONE, Key::ArrowUp) { return Some(Command::MoveUp); }
if i.consume_key(Modifiers::NONE, Key::ArrowDown) { return Some(Command::MoveDown); }
for event in i.events.iter() {
if let Event::Text(text) = event {
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn formula_name_mode(i: &mut egui::InputState) -> Option<Command> {
if i.consume_key(Modifiers::NONE, Key::Escape) { return Some(Command::Cancel); }
if i.consume_key(Modifiers::NONE, Key::Backspace) { return Some(Command::Backspace); }
if i.consume_key(Modifiers::NONE, Key::Enter) { return Some(Command::Confirm); }
for event in i.events.iter() {
if let Event::Text(text) = event {
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn formula_args_mode(i: &mut egui::InputState, edit_buffer: &str) -> Option<Command> {
if i.consume_key(Modifiers::NONE, Key::Escape) { return Some(Command::Cancel); }
if i.consume_key(Modifiers::NONE, Key::Backspace) { return Some(Command::Backspace); }
if i.consume_key(Modifiers::NONE, Key::Delete) { return Some(Command::DeleteBuffer); }
if i.consume_key(Modifiers::NONE, Key::Enter) {
return Some(if edit_buffer.is_empty() {
Command::FinishVariadic
} else {
Command::Confirm
});
}
for event in i.events.iter() {
if let Event::Text(text) = event {
if text == "=" && edit_buffer.is_empty() {
i.events.clear();
return Some(Command::StartNestedFormula);
}
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn command_mode(i: &mut egui::InputState) -> Option<Command> {
if i.consume_key(Modifiers::NONE, Key::Escape) { return Some(Command::Cancel); }
if i.consume_key(Modifiers::NONE, Key::Backspace) { return Some(Command::Backspace); }
if i.consume_key(Modifiers::NONE, Key::Enter) { return Some(Command::Confirm); }
if i.consume_key(Modifiers::NONE, Key::Space) { return Some(Command::TypeChar(' ')); }
for event in i.events.iter() {
if let Event::Text(text) = event {
if let Some(c) = text.chars().next() {
if !c.is_control() {
i.events.clear();
return Some(Command::TypeChar(c));
}
}
}
}
None
}
fn consume(i: &mut egui::InputState, ctrl: bool, _shift: bool, _alt: bool, key: Key) -> bool {
if ctrl {
i.consume_key(Modifiers::COMMAND, key) || i.consume_key(Modifiers::CTRL, key)
} else {
false
}
}