main draw function relocated to render; new input.rs file added to separate input processing (TBC)

type-render
korin 3 years ago
parent 8eeb02b636
commit f267c12e5c
  1. 48
      src/input.rs
  2. 52
      src/main.rs
  3. 68
      src/render.rs

@ -0,0 +1,48 @@
use sdl2::keyboard::Keycode;
mod keybinds {
pub(super) enum Clipboard {
CutSelection,
CutLines,
CopySelection,
CopyLines,
Paste,
PasteOverwrite,
}
pub(super) enum Editing {
Undo,
Redo,
NewLines,
DeleteLines,
}
pub(super) enum Movement {
DocBegin,
DocEnd,
LineBack,
LineBegin,
LineForward,
LineEnd,
CharBack,
CharForward,
WordBack,
WordForward,
ParaBack,
ParaForward,
}
pub(super) enum Selection {
CharBack,
Forward,
WordBack,
WordForward,
ParaBack,
ParaForward,
WholeLines,
}
}
fn input(buffer: &str, modifiers: crate::ModifierKeys, key: Keycode) {
}

@ -1,18 +1,13 @@
extern crate sdl2;
use clipboard::{ClipboardProvider, ClipboardContext};
use render::GlyphAtlas;
use num_format::{Locale, ToFormattedString};
use sdl2::{
event::{Event, WindowEvent},
keyboard::Keycode,
pixels::Color,
rect::{Point, Rect},
render::Canvas,
video::Window,
};
mod render;
mod input;
static SCREEN_WIDTH: u32 = 1280;
static SCREEN_HEIGHT: u32 = 720;
@ -35,49 +30,6 @@ struct ModifierKeys {
// glyph_atlas: GlyphAtlas,
// }
/// Draw all contents to the window
fn draw(canvas: &mut Canvas<Window>, glyph_atlas: &GlyphAtlas, buffer: &str, cursor_position: usize) -> Result<(), String> {
// Quick initialization
let window_size = canvas.output_size()?;
let text_offset = Point::new(10, 10);
// Draw background
canvas.set_draw_color(Color::RGB(32, 32, 32));
canvas.clear();
// Draw text
canvas.set_draw_color(Color::RGB(240, 240, 240));
let fb_text = render::draw_text(&glyph_atlas, buffer, text_offset);
canvas.draw_points(&fb_text[..])?;
// Draw info
let status = buffer.len().to_formatted_string(&Locale::en);
let status_position = Point::new(
text_offset.x,
window_size.1 as i32 - glyph_atlas.metrics.height as i32 * 2
);
canvas.set_draw_color(Color::RGB(16, 64, 64));
canvas.fill_rect(Rect::new(0,
status_position.y - 5,
window_size.0,
glyph_atlas.metrics.height as u32 + 10
))?;
canvas.set_draw_color(Color::RGB(127, 240, 240));
let status_bar = render::draw_text(&glyph_atlas, &status, status_position);
canvas.draw_points(&status_bar[..])?;
// Draw cursor
canvas.set_draw_color(Color::RGB(64, 240, 240));
let fb_cursor = render::draw_cursor(&glyph_atlas, cursor_position, buffer, text_offset);
canvas.draw_line(fb_cursor.0, fb_cursor.1)?;
canvas.present();
Ok(())
}
pub fn main() -> Result<(), String> {
// Initialize clipboard
let mut clipboard_context: ClipboardContext = ClipboardProvider::new().unwrap();
@ -115,7 +67,7 @@ pub fn main() -> Result<(), String> {
// Easier way to please the borrow checker
macro_rules! draw {
() => {
draw(&mut canvas, &glyph_atlas, &buffer, cursor_position)?
render::draw_everything(&mut canvas, &glyph_atlas, &buffer, cursor_position)?
};
}

@ -3,15 +3,21 @@
//! This takes a janky ass raw image file with width info inserted
//! and turns it into a bunch of points for SDL2 to read.
use std::{fs::File, path::Path, io::Read};
use num_format::{Locale, ToFormattedString};
use sdl2::{
pixels::Color,
rect::{Point, Rect},
render::Canvas,
video::Window,
};
use sdl2::rect::Point;
use std::{fs::File, path::Path, io::Read};
type Glyph = Vec<Point>;
pub struct GlyphMetrics {
pub width: usize,
pub height: usize,
struct GlyphMetrics {
width: usize,
height: usize,
}
impl GlyphMetrics {
@ -21,8 +27,8 @@ impl GlyphMetrics {
}
pub struct GlyphAtlas {
pub glyphs: Vec<Glyph>,
pub metrics: GlyphMetrics,
glyphs: Vec<Glyph>,
metrics: GlyphMetrics,
}
/// Reads the file and turns it into a Vec of u8s
@ -82,7 +88,7 @@ pub fn generate_glyph_data() -> GlyphAtlas {
}
/// Method for generating points to render, using given string
pub fn draw_text(glyph_atlas: &GlyphAtlas, content: &str, offset: Point) -> Vec<Point> {
fn draw_text(glyph_atlas: &GlyphAtlas, content: &str, offset: Point) -> Vec<Point> {
let mut points: Vec<Point> = vec![];
let glyph_width = glyph_atlas.metrics.width;
@ -140,3 +146,49 @@ pub fn draw_cursor(glyph_atlas: &GlyphAtlas, mut cursor_position: usize, content
}
(Point::new(offset.x, offset.y), Point::new(offset.x, offset.y + glyph_height as i32))
}
/// Draw all contents to the window
pub fn draw_everything(canvas: &mut Canvas<Window>,
glyph_atlas: &GlyphAtlas,
buffer: &str,
cursor_position: usize) -> Result<(), String> {
// Quick initialization
let window_size = canvas.output_size()?;
let text_offset = Point::new(10, 10);
// Draw background
canvas.set_draw_color(Color::RGB(32, 32, 32));
canvas.clear();
// Draw text
canvas.set_draw_color(Color::RGB(240, 240, 240));
let fb_text = draw_text(&glyph_atlas, buffer, text_offset);
canvas.draw_points(&fb_text[..])?;
// Draw info
let status = buffer.len().to_formatted_string(&Locale::en);
let status_position = Point::new(
text_offset.x,
window_size.1 as i32 - glyph_atlas.metrics.height as i32 * 2
);
canvas.set_draw_color(Color::RGB(16, 64, 64));
canvas.fill_rect(Rect::new(0,
status_position.y - 5,
window_size.0,
glyph_atlas.metrics.height as u32 + 10
))?;
canvas.set_draw_color(Color::RGB(127, 240, 240));
let status_bar = draw_text(&glyph_atlas, &status, status_position);
canvas.draw_points(&status_bar[..])?;
// Draw cursor
canvas.set_draw_color(Color::RGB(64, 240, 240));
let fb_cursor = draw_cursor(&glyph_atlas, cursor_position, buffer, text_offset);
canvas.draw_line(fb_cursor.0, fb_cursor.1)?;
canvas.present();
Ok(())
}

Loading…
Cancel
Save