Skip to content

Commit

Permalink
About to change a match statement.
Browse files Browse the repository at this point in the history
About to change a match statement to an if statement. You can't compare
anything to a dynamic variable in a match statement (at least on
easily). So I'm going to change it to a good ole if statement. Once
done, the user should be able to customize their keys bindings.
  • Loading branch information
Tylryan committed Dec 3, 2022
1 parent 66a5bb4 commit a611b09
Show file tree
Hide file tree
Showing 5 changed files with 201 additions and 159 deletions.
5 changes: 5 additions & 0 deletions src/app/impl_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use notify::DebouncedEvent;
use crate::app::{App, MessageKind};
use crate::habit::{HabitWrapper, ViewMode};
use crate::utils::{self, GRID_WIDTH, VIEW_HEIGHT, VIEW_WIDTH};
use crate::CONFIGURATION;

impl View for App {
fn draw(&self, printer: &Printer) {
Expand Down Expand Up @@ -58,6 +59,7 @@ impl View for App {
}

fn on_event(&mut self, e: Event) -> EventResult {
let up = CONFIGURATION.keybindings.up;
match self.file_event_recv.try_recv() {
Ok(DebouncedEvent::Write(_)) => {
let read_from_file = |file: PathBuf| -> Vec<Box<dyn HabitWrapper>> {
Expand All @@ -78,6 +80,9 @@ impl View for App {
if self.habits.is_empty() {
return EventResult::Ignored;
}

// TODO: Using a match statment, it won't be able to match on a dynamic variable
// This will have to be changed to an if statement
match e {
Event::Key(Key::Right) | Event::Key(Key::Tab) | Event::Char('l') => {
self.set_focus(Absolute::Right);
Expand Down
300 changes: 151 additions & 149 deletions src/keybinds.rs
Original file line number Diff line number Diff line change
@@ -1,149 +1,151 @@
use std::convert::From;

use cursive::event::Event as CursiveEvent;
use serde::ser;
use serde::{self, Deserialize, Serialize, Serializer};

#[derive(Debug, PartialEq)]
struct Event(CursiveEvent);

macro_rules! event {
($thing:expr) => {
Event { 0: $thing };
};
}

impl<T> From<T> for Event
where
T: AsRef<str>,
{
fn from(key: T) -> Self {
let key = key.as_ref();
if key.len() == 1 {
// single key
return event!(CursiveEvent::Char(key.chars().nth(0).unwrap()));
} else if (key.starts_with("c-") || key.starts_with("C-")) && key.len() == 3 {
// ctrl-key
return event!(CursiveEvent::CtrlChar(key.chars().nth(2).unwrap()));
} else {
panic!(
r"Invalid keybind in configuration!
(I intend to handle this error gracefully in the near future)"
);
}
}
}

enum Bind {
Char(char),
CtrlChar(char),
AltChar(char),
}

impl Serialize for Bind {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
Bind::Char(c) => serializer.serialize_newtype_variant("bind", 0, "regular", &c),
Bind::CtrlChar(c) => serializer.serialize_newtype_variant("bind", 0, "ctrl", &c),
Bind::AltChar(c) => serializer.serialize_newtype_variant("bind", 0, "alt", &c),
}
}
}

impl Deserialize for Bind {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
eprintln!("hell = {:#?}", hell);
}
}

impl From<Bind> for CursiveEvent {
fn from(key: Bind) -> Self {
match key {
Bind::Char(c) => CursiveEvent::Char(c),
Bind::CtrlChar(c) => CursiveEvent::Char(c),
Bind::AltChar(c) => CursiveEvent::AltChar(c),
}
}
}


#[derive(Serialize, Deserialize)]
pub struct Movement {
up: Bind,
down: Bind,
left: Bind,
right: Bind,
}

impl Movement {
pub fn new(left: char, down: char, up: char, right: char) -> Self {
return Movement {
up: Bind::Char(up),
down: Bind::Char(down),
left: Bind::Char(left),
right: Bind::Char(right),
};
}
}

#[derive(Serialize, Deserialize)]
pub struct KeyBinds {
grid: Movement,
cursor: Movement,
week_mode: Bind,
global_week_mode: Bind,
rename_habit: Bind,
}

impl std::default::Default for KeyBinds {
fn default() -> Self {
let grid = Movement::new('h', 'j', 'k', 'l');
let cursor = Movement::new('H', 'J', 'K', 'L');
return KeyBinds {
grid,
cursor,
week_mode: Bind::Char('v'),
global_week_mode: Bind::Char('V'),
rename_habit: Bind::Char('R'),
};
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn normal_keybind() {
let bind = "X";
let expected = CursiveEvent::Char('X');
assert_eq!(Event::from(bind), event!(expected));
}

#[test]
fn control_keybind() {
let bind = "C-x";
let expected = CursiveEvent::CtrlChar('x');
assert_eq!(Event::from(bind), event!(expected));
}

#[test]
fn lower_case_control_keybind() {
let bind = "c-x";
let expected = CursiveEvent::CtrlChar('x');
assert_eq!(Event::from(bind), event!(expected));
}

#[test]
#[should_panic]
fn very_long_and_wrong_keybind() {
let bind = "alksdjfalkjdf";
Event::from(bind);
}
}
// use std::convert::From;

// use cursive::event::Event as CursiveEvent;
// use serde::ser;
// use serde::{self, Deserialize, Serialize, Serializer};
// use crate::CONFIGURATION;

// #[derive(Debug, PartialEq)]
// struct Event(CursiveEvent);

// macro_rules! event {
// ($thing:expr) => {
// Event { 0: $thing };
// };
// }

// impl<T> From<T> for Event
// where
// T: AsRef<str>,
// {
// fn from(key: T) -> Self {
// let key = key.as_ref();
// if key.len() == 1 {
// // single key
// return event!(CursiveEvent::Char(key.chars().nth(0).unwrap()));
// } else if (key.starts_with("c-") || key.starts_with("C-")) && key.len() == 3 {
// // ctrl-key
// return event!(CursiveEvent::CtrlChar(key.chars().nth(2).unwrap()));
// } else {
// panic!(
// r"Invalid keybind in configuration!
// (I intend to handle this error gracefully in the near future)"
// );
// }
// }
// }

// enum Bind {
// Char(char),
// CtrlChar(char),
// AltChar(char),
// }

// impl Serialize for Bind {
// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
// where
// S: Serializer,
// {
// match self {
// Bind::Char(c) => serializer.serialize_newtype_variant("bind", 0, "regular", &c),
// Bind::CtrlChar(c) => serializer.serialize_newtype_variant("bind", 0, "ctrl", &c),
// Bind::AltChar(c) => serializer.serialize_newtype_variant("bind", 0, "alt", &c),
// }
// }
// }

// impl Deserialize for Bind {
// fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
// where
// D: Deserializer<'de>,
// {
// eprintln!("hell = {:#?}", hell);
// }
// }

// impl From<Bind> for CursiveEvent {
// fn from(key: Bind) -> Self {
// match key {
// Bind::Char(c) => CursiveEvent::Char(c),
// Bind::CtrlChar(c) => CursiveEvent::Char(c),
// Bind::AltChar(c) => CursiveEvent::AltChar(c),
// }
// }
// }


// #[derive(Serialize, Deserialize)]
// pub struct Movement {
// up: Bind,
// down: Bind,
// left: Bind,
// right: Bind,
// }

// impl Movement {
// pub fn new(left: char, down: char, up: char, right: char) -> Self {
// return Movement {
// up: Bind::Char(up),
// down: Bind::Char(down),
// left: Bind::Char(left),
// right: Bind::Char(right),
// };
// }
// }

// #[derive(Serialize, Deserialize)]
// pub struct KeyBinds {
// grid: Movement,
// cursor: Movement,
// week_mode: Bind,
// global_week_mode: Bind,
// rename_habit: Bind,
// }

// impl std::default::Default for KeyBinds {
// fn default() -> Self {
// let up: String = CONFIGURATION.keybindings.up();
// let grid = Movement::new(&up, 'j', 'k', 'l');
// let cursor = Movement::new('H', 'J', 'K', 'L');
// return KeyBinds {
// grid,
// cursor,
// week_mode: Bind::Char('v'),
// global_week_mode: Bind::Char('V'),
// rename_habit: Bind::Char('R'),
// };
// }
// }

// #[cfg(test)]
// mod tests {
// use super::*;

// #[test]
// fn normal_keybind() {
// let bind = "X";
// let expected = CursiveEvent::Char('X');
// assert_eq!(Event::from(bind), event!(expected));
// }

// #[test]
// fn control_keybind() {
// let bind = "C-x";
// let expected = CursiveEvent::CtrlChar('x');
// assert_eq!(Event::from(bind), event!(expected));
// }

// #[test]
// fn lower_case_control_keybind() {
// let bind = "c-x";
// let expected = CursiveEvent::CtrlChar('x');
// assert_eq!(Event::from(bind), event!(expected));
// }

// #[test]
// #[should_panic]
// fn very_long_and_wrong_keybind() {
// let bind = "alksdjfalkjdf";
// Event::from(bind);
// }
// }
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod habit;
mod theme;
mod utils;
mod views;
mod keybinds;

use crate::app::App;
use crate::command::{open_command_window, Command};
Expand Down
2 changes: 1 addition & 1 deletion src/theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub fn pallete_gen() -> Palette {
pub fn theme_gen() -> Theme {
let mut t = Theme::default();
t.shadow = false;
t.borders = BorderStyle::None;
t.borders = BorderStyle::Simple;
t.palette = pallete_gen();
return t;
}
Expand Down
Loading

0 comments on commit a611b09

Please sign in to comment.