A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs153
1 files changed, 85 insertions, 68 deletions
diff --git a/src/main.rs b/src/main.rs
index 867cfd3..4d370fc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,7 @@
+#![feature(generic_const_exprs, const_trait_impl)]
use std::num::NonZeroU32;
-use std::sync::{LazyLock};
+use std::sync::LazyLock;
+
use dsb::cell::Style;
use swash::FontRef;
use winit::event::{ElementState, Event, KeyEvent, WindowEvent};
@@ -16,93 +18,108 @@ fn main() {
}
#[implicit_fn::implicit_fn]
pub(crate) fn entry(event_loop: EventLoop<()>) {
- let ppem = 20.0;
- let ls = 200.0;
- let mut text = TextArea::default() ;
+ let ppem = 15.0;
+ let ls = 20.0;
+ let mut text = TextArea::default();
+ std::env::args().nth(1).map(|x| {
+ text.insert(&std::fs::read_to_string(x).unwrap());
+ });
let app = winit_app::WinitAppBuilder::with_init(
|elwt| {
let window = winit_app::make_window(elwt, |w| w);
window.set_ime_allowed(true);
-
- let context = softbuffer::Context::new(window.clone()).unwrap();
+
+ let context =
+ softbuffer::Context::new(window.clone()).unwrap();
(window, context)
},
- |_elwt, (window, context)| softbuffer::Surface::new(context, window.clone()).unwrap(),
+ |_elwt, (window, context)| {
+ softbuffer::Surface::new(context, window.clone()).unwrap()
+ },
)
- .with_event_handler(move |(window, _context), surface, event, elwt| {
- elwt.set_control_flow(ControlFlow::Wait);
+ .with_event_handler(
+ move |(window, _context), surface, event, elwt| {
+ elwt.set_control_flow(ControlFlow::Wait);
+ match event {
+ Event::WindowEvent {
+ window_id,
+ event: WindowEvent::Resized(size),
+ } if window_id == window.id() => {
+ let Some(surface) = surface else {
+ eprintln!("Resized fired before Resumed or after Suspended");
+ return;
+ };
- match event {
- Event::WindowEvent {
- window_id,
- event: WindowEvent::Resized(size),
- } if window_id == window.id() => {
- let Some(surface) = surface else {
- eprintln!("Resized fired before Resumed or after Suspended");
- return;
- };
+ if let (Some(width), Some(height)) =
+ (NonZeroU32::new(size.width), NonZeroU32::new(size.height))
+ {
+ surface.resize(width, height).unwrap();
+ }
+ }
+ Event::WindowEvent {
+ window_id,
+ event: WindowEvent::RedrawRequested,
+ } if window_id == window.id() => {
+ let Some(surface) = surface else {
+ eprintln!("RedrawRequested fired before Resumed or after Suspended");
+ return;
+ };
+ let size = window.inner_size();
- if let (Some(width), Some(height)) =
+ if let (Some(width), Some(height)) =
(NonZeroU32::new(size.width), NonZeroU32::new(size.height))
- {
- surface.resize(width, height).unwrap();
- }
- }
- Event::WindowEvent {
- window_id,
- event: WindowEvent::RedrawRequested,
- } if window_id == window.id() => {
- let Some(surface) = surface else {
- eprintln!("RedrawRequested fired before Resumed or after Suspended");
- return;
- };
- let size = window.inner_size();
-
- if let (Some(width), Some(height)) =
- (NonZeroU32::new(size.width), NonZeroU32::new(size.height))
- {
- let (c, r) = dsb::fit(&FONT,ppem,ls, (size.width as _,size.height as _));
- let cells =text.cells((c, r),[255;3], [0;3])
- ;
-let r = unsafe {
-dsb::render(&cells, (c, r), ppem, [0;3],dsb::Fonts::new(*FONT, *FONT, *FONT, *FONT),
- ls)};
+ {
+ let (c, r) = dsb::fit(&FONT,ppem,ls, (size.width as _,size.height as _));
+ let cells =text.cells((c, r),[204, 202, 194], [36, 41, 54],);
+ let r = unsafe {
+ dsb::render(&cells, (c, r), ppem, [36, 41, 54],dsb::Fonts::new(*FONT, *FONT, *FONT, *FONT),
+ ls, false)};
-let mut buffer = surface.buffer_mut().unwrap();
- for y in 0..height.get() {
- for x in 0..width.get() {
- let [red, green, blue] =r.get_pixel(x, y).unwrap_or_default().map(_ as u32);
- let index = y as usize * width.get() as usize + x as usize;
- buffer[index] = blue | (green << 8) | (red << 16);
+ let mut buffer = surface.buffer_mut().unwrap();
+ for y in 0..height.get() {
+ for x in 0..width.get() {
+ let [red, green, blue] =r.get_pixel(x, y).unwrap_or_default().map(_ as u32);
+ let index = y as usize * width.get() as usize + x as usize;
+ buffer[index] = blue | (green << 8) | (red << 16);
+ }
}
+
+ buffer.present().unwrap();
}
+ }
- buffer.present().unwrap();
+ Event::WindowEvent {
+ event:
+ WindowEvent::CloseRequested
+ ,
+ window_id,
+ } if window_id == window.id() => {
+ elwt.exit();
}
- }
-
- Event::WindowEvent {
- event:
- WindowEvent::CloseRequested
- ,
- window_id,
- } if window_id == window.id() => {
- elwt.exit();
- }
- Event::WindowEvent{
- event:WindowEvent::KeyboardInput { device_id, event, is_synthetic },window_id
- } if event.state == ElementState::Pressed => {
+ Event::WindowEvent{
+ event:WindowEvent::KeyboardInput { device_id, event, is_synthetic }, window_id
+ } if event.state == ElementState::Pressed => {
+
+ match dbg!(event.logical_key ){
+ Key::Named(NamedKey::Space)=>
+ text.insert(" "),
+ Key::Named(NamedKey::Backspace) => text.backspace(),
- if let Some(t) = event.text {
+ Key::Named(NamedKey::Enter)=>
+ text.insert("\n"),
+ Key::Character(x) => {
+ text.insert(&*x);
+ }
+ _ =>{}
+ }
- text.insert(&*t);
window.request_redraw();
- }
+ }
+ _ => {}
}
- _ => {}
- }
- });
+ },
+ );
winit_app::run_app(event_loop, app);
}