|
@@ -1,3 +1,10 @@
|
|
|
+use std::{
|
|
|
+ fs::File,
|
|
|
+ io::{Cursor, Read, Write},
|
|
|
+ path::PathBuf,
|
|
|
+};
|
|
|
+
|
|
|
+use binrw::{BinRead, BinWriterExt};
|
|
|
use ezcad::pen::Pen;
|
|
|
use log::debug;
|
|
|
use serde::{Deserialize, Serialize};
|
|
@@ -21,8 +28,8 @@ pub struct Patch {
|
|
|
}
|
|
|
|
|
|
impl Patch {
|
|
|
- fn patch(&self, id: usize, target: &mut Vec<Pen>) {
|
|
|
- let to_patch: &mut Pen = target.get_mut(id).expect("Invalid pen index");
|
|
|
+ fn patch(&self, id: usize, pens: &mut Vec<Pen>) {
|
|
|
+ let to_patch: &mut Pen = pens.get_mut(id).expect("Invalid pen index");
|
|
|
|
|
|
if let Some(color) = self.color {
|
|
|
debug!("Patching color for pen #{}: {:?}", id, color);
|
|
@@ -88,8 +95,8 @@ pub struct PatchPen {
|
|
|
}
|
|
|
|
|
|
impl PatchPen {
|
|
|
- pub fn patch(&self, target: &mut Vec<Pen>) {
|
|
|
- self.patch.patch(self.pen, target);
|
|
|
+ pub fn patch(&self, pens: &mut Vec<Pen>) {
|
|
|
+ self.patch.patch(self.pen, pens);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -103,7 +110,7 @@ pub struct ClonePen {
|
|
|
}
|
|
|
|
|
|
impl ClonePen {
|
|
|
- pub fn clone(&self, target: &mut Vec<Pen>) {
|
|
|
+ pub fn clone(&self, pens: &mut Vec<Pen>) {
|
|
|
debug!("Cloning pen #{} to #{}", self.from, self.to);
|
|
|
assert!(
|
|
|
self.to > self.from,
|
|
@@ -111,13 +118,13 @@ impl ClonePen {
|
|
|
);
|
|
|
|
|
|
// Clone pen
|
|
|
- let src: Pen = target.get(self.from).expect("Invalid pen index").clone();
|
|
|
- let dst: &mut Pen = target.get_mut(self.to).expect("Invalid pen index");
|
|
|
+ let src: Pen = pens.get(self.from).expect("Invalid pen index").clone();
|
|
|
+ let dst: &mut Pen = pens.get_mut(self.to).expect("Invalid pen index");
|
|
|
*dst = src;
|
|
|
|
|
|
// Patch pen if needed
|
|
|
if let Some(patch) = &self.patch {
|
|
|
- patch.patch(self.to, target);
|
|
|
+ patch.patch(self.to, pens);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -139,7 +146,7 @@ pub struct PatternPen {
|
|
|
}
|
|
|
|
|
|
impl PatternPen {
|
|
|
- pub fn pattern(&self, target: &mut Vec<Pen>) {
|
|
|
+ pub fn pattern(&self, pens: &mut Vec<Pen>) {
|
|
|
debug!("Patterning from pen #{} to #{}", self.from, self.to);
|
|
|
assert!(
|
|
|
self.to > self.from,
|
|
@@ -147,7 +154,7 @@ impl PatternPen {
|
|
|
);
|
|
|
|
|
|
// Obtain settings from first pen
|
|
|
- let src: Pen = target.get(self.from).expect("Invalid pen index").clone();
|
|
|
+ let src: Pen = pens.get(self.from).expect("Invalid pen index").clone();
|
|
|
|
|
|
let mut setting: PatternField = match self.field {
|
|
|
PatternField::Loops(_) => {
|
|
@@ -176,7 +183,7 @@ impl PatternPen {
|
|
|
|
|
|
for dst in (self.from..=self.to).skip(1) {
|
|
|
// Clone to target pen
|
|
|
- let pen: &mut Pen = target.get_mut(dst).expect("Invalid pen index");
|
|
|
+ let pen: &mut Pen = pens.get_mut(dst).expect("Invalid pen index");
|
|
|
*pen = src.clone();
|
|
|
|
|
|
// Calculate new setting
|
|
@@ -240,3 +247,50 @@ impl PatternPen {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#[derive(Debug, Serialize, Deserialize)]
|
|
|
+#[serde(rename_all = "PascalCase")]
|
|
|
+pub struct ImportExportPen {
|
|
|
+ index: usize,
|
|
|
+ path: PathBuf,
|
|
|
+}
|
|
|
+
|
|
|
+impl ImportExportPen {
|
|
|
+ pub fn export(&self, pens: &mut Vec<Pen>) {
|
|
|
+ debug!(
|
|
|
+ "Exporting pen #{} to '{}'",
|
|
|
+ self.index,
|
|
|
+ self.path.to_string_lossy()
|
|
|
+ );
|
|
|
+
|
|
|
+ let pen = pens.get(self.index).expect("Invalid pen index");
|
|
|
+
|
|
|
+ let mut buffer: Cursor<Vec<u8>> = Cursor::new(vec![]);
|
|
|
+ buffer.write_le(pen).expect("Failed to serialize pen");
|
|
|
+
|
|
|
+ let mut output: File = File::create(&self.path).expect("Failed to open output file");
|
|
|
+ output
|
|
|
+ .write_all(buffer.into_inner().as_slice())
|
|
|
+ .expect("Failed to write to output file");
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn import(&self, pens: &mut Vec<Pen>) {
|
|
|
+ debug!(
|
|
|
+ "Importing pen #{} from '{}'",
|
|
|
+ self.index,
|
|
|
+ self.path.to_string_lossy()
|
|
|
+ );
|
|
|
+
|
|
|
+ let mut input: File = File::open(&self.path).expect("Failed to open input file");
|
|
|
+
|
|
|
+ let mut buffer: Cursor<Vec<u8>> = Cursor::new(vec![]);
|
|
|
+ input
|
|
|
+ .read_to_end(buffer.get_mut())
|
|
|
+ .expect("Failed to read input file");
|
|
|
+
|
|
|
+ let pen: Pen = Pen::read_le(&mut buffer).expect("Failed to deserialize input as pen");
|
|
|
+
|
|
|
+ let dst: &mut Pen = pens.get_mut(self.index).expect("Invalid pen index");
|
|
|
+ *dst = pen;
|
|
|
+ }
|
|
|
+}
|