aboutsummaryrefslogtreecommitdiff
path: root/src/app.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/app.rs b/src/app.rs
index 29a292f..1263324 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -2,7 +2,7 @@ use crate::{
2 bitmap::{positive_angle_with_x, MapPoint, Pixmap}, 2 bitmap::{positive_angle_with_x, MapPoint, Pixmap},
3 brush::{Brush, CircleBrush, LineBrush}, 3 brush::{Brush, CircleBrush, LineBrush},
4 command::CommandBox, 4 command::CommandBox,
5 consts::{colors::*, FONT_PATH, STDLIB_PATH}, 5 consts::{colors::*, FONT_PATH, RC_PATH, STDLIB_PATH},
6 dither, 6 dither,
7 error::AppError, 7 error::AppError,
8 lisp::{eval, lex::Lexer, parse::Parser, prelude, EnvList}, 8 lisp::{eval, lex::Lexer, parse::Parser, prelude, EnvList},
@@ -13,7 +13,12 @@ use crate::{
13 utils::{draw_text, handle_error, is_copy_event, is_paste_event, load_script}, 13 utils::{draw_text, handle_error, is_copy_event, is_paste_event, load_script},
14}; 14};
15 15
16use std::{convert::From, fs::File, io::prelude::*, path::Path}; 16use std::{
17 convert::From,
18 fs::File,
19 io::prelude::*,
20 path::{Path, PathBuf},
21};
17 22
18use obi::Image; 23use obi::Image;
19use sdl2::{ 24use sdl2::{
@@ -34,7 +39,7 @@ pub enum Mode {
34 Command, 39 Command,
35} 40}
36 41
37pub struct AppState<'ctx, 'file> { 42pub struct AppState<'ctx> {
38 pub active_color: bool, 43 pub active_color: bool,
39 pub brush: Brush, 44 pub brush: Brush,
40 pub canvas: Canvas<Window>, 45 pub canvas: Canvas<Window>,
@@ -42,7 +47,7 @@ pub struct AppState<'ctx, 'file> {
42 pub context: &'ctx Sdl, 47 pub context: &'ctx Sdl,
43 pub current_operation: Vec<PaintRecord>, 48 pub current_operation: Vec<PaintRecord>,
44 pub dither_level: u8, 49 pub dither_level: u8,
45 pub file_name: Option<&'file Path>, 50 pub file_name: Option<PathBuf>,
46 pub grid: Grid, 51 pub grid: Grid,
47 pub lisp_env: EnvList, 52 pub lisp_env: EnvList,
48 pub message: Message, 53 pub message: Message,
@@ -71,7 +76,7 @@ impl Grid {
71} 76}
72 77
73// private actions on appstate 78// private actions on appstate
74impl<'ctx, 'file> AppState<'ctx, 'file> { 79impl<'ctx> AppState<'ctx> {
75 fn pan<P: Into<Point>>(&mut self, direction: P) { 80 fn pan<P: Into<Point>>(&mut self, direction: P) {
76 self.start += direction.into(); 81 self.start += direction.into();
77 } 82 }
@@ -516,7 +521,7 @@ impl<'ctx, 'file> AppState<'ctx, 'file> {
516 context: &'ctx Sdl, 521 context: &'ctx Sdl,
517 ttf_context: &'ctx Sdl2TtfContext, 522 ttf_context: &'ctx Sdl2TtfContext,
518 start_data: Option<Vec<bool>>, 523 start_data: Option<Vec<bool>>,
519 file_name: Option<&'file Path>, 524 file_name: Option<PathBuf>,
520 ) -> Result<Self, AppError> { 525 ) -> Result<Self, AppError> {
521 let video_subsystem = context.video().map_err(AppError::Sdl)?; 526 let video_subsystem = context.video().map_err(AppError::Sdl)?;
522 527
@@ -557,6 +562,9 @@ impl<'ctx, 'file> AppState<'ctx, 'file> {
557 zoom: 5, 562 zoom: 5,
558 }; 563 };
559 load_script(STDLIB_PATH, &mut app).map_err(AppError::Lisp)?; 564 load_script(STDLIB_PATH, &mut app).map_err(AppError::Lisp)?;
565 std::fs::create_dir_all(RC_PATH).map_err(AppError::File)?;
566 load_script([RC_PATH, "rc.lisp"].iter().collect::<PathBuf>(), &mut app)
567 .map_err(AppError::Lisp)?;
560 Ok(app) 568 Ok(app)
561 } 569 }
562 570
@@ -566,6 +574,13 @@ impl<'ctx, 'file> AppState<'ctx, 'file> {
566 image 574 image
567 } 575 }
568 576
577 pub fn save_as<P: AsRef<Path>>(&self, file_name: P) -> Result<(), AppError> {
578 let image = self.export().encode().unwrap();
579 let mut file = File::create(file_name).map_err(AppError::File)?;
580 file.write_all(&image[..]).unwrap();
581 return Ok(());
582 }
583
569 pub fn run(&mut self) { 584 pub fn run(&mut self) {
570 self.canvas.set_draw_color(BLACK); 585 self.canvas.set_draw_color(BLACK);
571 self.canvas.clear(); 586 self.canvas.clear();