1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
extern crate crossterm;
use crossterm::event::{poll, read, Event, KeyCode, KeyModifiers, MouseEvent,
  MouseButton};

extern crate std;
use std::time::Duration;

use crate::log;

use crate::events::UserEvent;
use crate::errors::UserError;
use crate::views::View;

pub fn catch_events(log: &mut log::Log) -> (UserEvent, UserError, View) {
  if poll(Duration::from_nanos(1)).unwrap() {
    match read().unwrap() {
      Event::Key(key_event) => {
        if key_event.modifiers.is_empty() {
          match key_event.code {
            KeyCode::Esc => {
              return (UserEvent::Exit, UserError::ResizeCheck, View::Edit)
            },
            KeyCode::Char('a') => {
              log.brush_previous();
            },
            KeyCode::Char('c') => {
              return (UserEvent::SetBrushColor,
                UserError::ResizeCheck, View::Edit)
            },
            KeyCode::Char('g') => {
              return (UserEvent::SetGenerationNumber,
                UserError::ResizeCheck, View::Edit)
            },
            KeyCode::Char('h') => {
              log.increment_height();
            },
            KeyCode::Char('n') => {
              log.grids_next();
            },
            KeyCode::Char('q') => {
              log.brush_next();
            },
            KeyCode::Char('s') => {
              return (UserEvent::Continue,
                UserError::ResizeCheck, View::Parameters)
            },
            KeyCode::Char('r') => {
              return (UserEvent::RenameGrid,
                UserError::ResizeCheck, View::Edit)
            },
            KeyCode::Char('u') => {
              log.undo();
            },
            KeyCode::Char('w') => {
              log.increment_width();
            },
            KeyCode::Char('+') => {
              if !log.grids_isfull() {
                return (UserEvent::GridName,
                  UserError::ResizeCheck, View::Edit)
              } else {
                return (UserEvent::GridNumberError,
                  UserError::ResizeCheck, View::Edit)
              }
            },
            KeyCode::Char('-') => {
              if !log.grids_isalone() {
                log.grids_deletecurrentgrid();
              } else {
                return (UserEvent::GridNumberError,
                  UserError::ResizeCheck, View::Edit)
              }
            },
            KeyCode::Up => {
              log.gridscroll_scrollup();
            },
            KeyCode::Down => {
              log.gridscroll_scrolldown();
            },
            KeyCode::Right => {
              log.gridscroll_scrollright();
            },
            KeyCode::Left => {
              log.gridscroll_scrollleft();
            },
            _ => (),
          }
        } else if key_event.modifiers == KeyModifiers::SHIFT {
          match key_event.code {
            KeyCode::Char('C') => {
              log.clear();
            },
            KeyCode::Char('H') => {
              log.decrement_height();
            },
            KeyCode::Char('N') => {
              log.grids_previous();
            },
            KeyCode::Char('S') => {
              if !log.grids_isalone() {
                return (UserEvent::SwitchGridsOrder,
                  UserError::ResizeCheck, View::Edit)
              } else {
                return (UserEvent::SwitchGridsError,
                  UserError::ResizeCheck, View::Edit)
              }
            },
            KeyCode::Char('U') => {
              log.redo();
            },
            KeyCode::Char('W') => {
              log.decrement_width();
            },
            _ => (),
          }
        }
      }
      Event::Mouse(mouse_event) => match mouse_event {
        MouseEvent::Down(MouseButton::Left, x, y, _) |
          MouseEvent::Drag(MouseButton::Left, x, y, _) => {
            log.brush((x, y));
        },
        MouseEvent::Down(MouseButton::Right, x, y, _) |
          MouseEvent::Drag(MouseButton::Right, x, y, _) => {
            log.erase((x, y));
        },
        _ => {}
      },
      Event::Resize(_, _) => {
        if log.overflow() {
          return (UserEvent::LogOverflow, UserError::ResizeCheck, View::Edit)
        } else {
          return (UserEvent::Continue, UserError::ResizeCheck, View::Edit)
        }
      },
    }
  }
  if log.overflow() {
    (UserEvent::LogOverflow, UserError::ResizeCheck, View::Edit)
  } else {
    (UserEvent::Continue, UserError::NoneError, View::Edit)
  }
}