A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/bar.rs')
-rw-r--r--src/bar.rs63
1 files changed, 26 insertions, 37 deletions
diff --git a/src/bar.rs b/src/bar.rs
index 39167b5..d2aacf9 100644
--- a/src/bar.rs
+++ b/src/bar.rs
@@ -2,30 +2,13 @@ use std::iter::{once, repeat};
use dsb::Cell;
use dsb::cell::Style;
+use winit::keyboard::{Key, ModifiersState, NamedKey};
pub struct Bar {
- pub state: state::StateMachine,
pub text: crate::text::TextArea,
pub last_action: String,
}
-rust_fsm::state_machine! {
- #[derive(Debug, PartialEq, Eq, Copy, Clone)]
- pub(crate) state(Inactive)
-
- Inactive => {
- Control => Control,
- },
- Control => {
- Saved => Inactive,
- WaitingForFname => InputFname,
- Released => Inactive,
- },
- InputFname => {
- Enter => Inactive,
- }
-}
-
impl Bar {
pub fn write_to(
&self,
@@ -34,6 +17,7 @@ impl Bar {
(into, (w, _)): (&mut [Cell], (usize, usize)),
oy: usize,
fname: &str,
+ state: &super::State,
) {
let row = &mut into[oy * w..oy * w + w];
row.fill(Cell {
@@ -43,26 +27,14 @@ impl Bar {
fn s(s: &str) -> impl Iterator<Item = (char, u8)> {
s.chars().zip(repeat(0))
}
- match self.state.state() {
- state::State::Inactive => {
- row[1.."gracilaria".len() + 1]
- .iter_mut()
- .zip("gracilaria".chars())
- .for_each(|(x, y)| x.letter = Some(y));
- row[w / 2 - fname.len() / 2
- ..w / 2 - fname.len() / 2 + fname.len()]
- .iter_mut()
- .zip(fname.chars())
- .for_each(|(x, y)| x.letter = Some(y));
- row.iter_mut()
- .rev()
- .zip(self.last_action.chars().rev())
- .for_each(|(x, y)| x.letter = Some(y));
- }
- state::State::Control => {
+ use super::State;
+ match state {
+ State::Default if super::ctrl() => {
let x = s("C + { ")
.chain(once(('S', Style::BOLD)))
.chain(s("ave, "))
+ .chain(once(('Q', Style::BOLD)))
+ .chain(s("uit, "))
.chain(once(('C', Style::BOLD)))
.chain(s("opy }"));
@@ -74,11 +46,26 @@ impl Bar {
}
});
}
- state::State::InputFname => {
+ State::Default => {
+ row[1.."gracilaria".len() + 1]
+ .iter_mut()
+ .zip("gracilaria".chars())
+ .for_each(|(x, y)| x.letter = Some(y));
+ row[w / 2 - fname.len() / 2
+ ..w / 2 - fname.len() / 2 + fname.len()]
+ .iter_mut()
+ .zip(fname.chars())
+ .for_each(|(x, y)| x.letter = Some(y));
+ row.iter_mut()
+ .rev()
+ .zip(self.last_action.chars().rev())
+ .for_each(|(x, y)| x.letter = Some(y));
+ }
+ State::InputFname(x) => {
"write to file: "
.chars()
.zip(repeat(Style::BOLD | Style::ITALIC))
- .chain(s(&self.text.rope.to_string()))
+ .chain(s(&x.rope.to_string()))
.zip(row)
.for_each(|((x, z), y)| {
*y = Cell {
@@ -88,6 +75,8 @@ impl Bar {
}
});
}
+ State::Save => unreachable!(),
+ _ => {}
}
}
}