Skip to content

Commit

Permalink
feat: parse more data from the XSD patterns
Browse files Browse the repository at this point in the history
  • Loading branch information
niusia-ua committed Oct 22, 2024
1 parent 7b50305 commit 7b3ca9f
Show file tree
Hide file tree
Showing 53 changed files with 2,336 additions and 1,177 deletions.
145 changes: 22 additions & 123 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ tauri-build = { version = "2.0.1", features = [] }

[dependencies]
# Tauri
tauri = { version = "2.0.3", features = ["test"] }
tauri = { version = "2.0.2", features = ["test"] }
tauri-plugin-dialog = "2.0.1"
tauri-plugin-log = "2.0.1"

Expand Down
24 changes: 15 additions & 9 deletions src-tauri/src/commands/pattern.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::{
error::CommandResult,
parser::{self, PatternFormat},
pattern::Pattern,
pattern::{display::DisplaySettings, print::PrintSettings, Pattern, PatternProject},
state::{AppStateType, PatternKey},
};

Expand All @@ -12,18 +12,19 @@ pub fn load_pattern(file_path: std::path::PathBuf, state: tauri::State<AppStateT
let pattern_key = PatternKey::from(file_path.clone());
let pattern = match state.patterns.get(&pattern_key) {
Some(pattern) => {
log::trace!("Pattern already loaded");
log::trace!("Pattern has been already loaded");
pattern.to_owned()
}
None => {
let pattern_format = PatternFormat::try_from(file_path.extension())?;
let pattern = match pattern_format {
PatternFormat::Xsd => parser::xsd::parse_pattern(file_path)?,
PatternFormat::Oxs => parser::oxs::parse_pattern(file_path)?,
PatternFormat::Embx => {
let mut reader = std::fs::File::open(file_path)?;
borsh::from_reader(&mut reader)?
}
// PatternFormat::EmbProj => {
// let mut reader = std::fs::File::open(file_path)?;
// borsh::from_reader(&mut reader)?
// }
PatternFormat::EmbProj => todo!(),
};
state.patterns.insert(pattern_key, pattern.clone());
pattern
Expand All @@ -38,10 +39,15 @@ pub fn create_pattern(state: tauri::State<AppStateType>) -> (PatternKey, Vec<u8>
log::trace!("Creating new pattern");
let mut state = state.write().unwrap();
let file_path = std::path::PathBuf::from(format!("Untitled-{:?}.json", std::time::Instant::now()));
let pattern_key = PatternKey::from(file_path);
let pattern = Pattern::default();
let pattern_key = PatternKey::from(file_path.clone());
let pattern = PatternProject {
file_path: Some(file_path),
pattern: Pattern::default(),
display_settings: DisplaySettings::new(2),
print_settings: PrintSettings::default(),
};
state.patterns.insert(pattern_key.clone(), pattern.clone());
log::trace!("Pattern created");
log::trace!("Pattern has been created");
// It is safe to unwrap here, because the pattern is always serializable.
(pattern_key, borsh::to_vec(&pattern).unwrap())
}
Expand Down
4 changes: 2 additions & 2 deletions src-tauri/src/events/pattern.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub fn setup_event_handlers(window: &WebviewWindow, app_handle: &AppHandle) {
// This is safe because the event is only emitted when the pattern exists.
let pattern = state.patterns.get_mut(&pattern_key).unwrap();

emit_remove_stitches(&win, pattern_key, pattern.add_stitch(payload));
emit_remove_stitches(&win, pattern_key, pattern.pattern.add_stitch(payload));
});

let handle = app_handle.clone();
Expand All @@ -44,7 +44,7 @@ pub fn setup_event_handlers(window: &WebviewWindow, app_handle: &AppHandle) {
serde_json::from_str::<EventStitchPayload<Stitch>>(e.payload()).unwrap();
// This is safe because the event is only emitted when the pattern exists.
let pattern = state.patterns.get_mut(&pattern_key).unwrap();
pattern.remove_stitch(payload);
pattern.pattern.remove_stitch(payload);
});
}

Expand Down
14 changes: 12 additions & 2 deletions src-tauri/src/parser/format.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
use std::ffi::OsStr;

pub enum PatternFormat {
/// Probably, stands for `Cross-Stitch Design`.
/// Only **read-only** mode is currently available.
Xsd,

/// Stands for `Open Cross-Stitch`.
/// It is just an XML document.
/// This format is intended to be a lingua franca in the embroidery world.
Oxs,
Embx,

/// Stands for `Embroidery Project`.
/// It is a ZIP archive with a pack of binary files.
/// This format is not recommended for other applications.
EmbProj,
}

impl TryFrom<Option<&OsStr>> for PatternFormat {
Expand All @@ -15,7 +25,7 @@ impl TryFrom<Option<&OsStr>> for PatternFormat {
match extension.to_lowercase().as_str() {
"xsd" => Ok(Self::Xsd),
"oxs" | "xml" => Ok(Self::Oxs),
"embx" => Ok(Self::Embx),
"embproj" => Ok(Self::EmbProj),
_ => anyhow::bail!("Unsupported pattern type: {extension}."),
}
} else {
Expand Down
12 changes: 6 additions & 6 deletions src-tauri/src/parser/oxs/parser.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
use anyhow::{bail, Result};
use quick_xml::events::Event;

use crate::pattern::Pattern;
use crate::pattern::PatternProject;

use super::{
utils::{process_attributes, OxsVersion, Software},
v1_0,
};

pub fn parse_pattern(path: impl AsRef<std::path::Path>) -> Result<Pattern> {
pub fn parse_pattern(file_path: std::path::PathBuf) -> Result<PatternProject> {
log::trace!("Parsing the OXS pattern");

let mut reader = quick_xml::Reader::from_file(path.as_ref())?;
let mut reader = quick_xml::Reader::from_file(&file_path)?;
let mut buf = Vec::new();
let (oxs_version, software) = loop {
match reader.read_event_into(&mut buf) {
Expand All @@ -33,9 +33,9 @@ pub fn parse_pattern(path: impl AsRef<std::path::Path>) -> Result<Pattern> {
buf.clear();
};

let pattern = match oxs_version {
OxsVersion::V1_0 => v1_0::parse_pattern(path.as_ref(), software)?,
let pattern_project = match oxs_version {
OxsVersion::V1_0 => v1_0::parse_pattern(file_path, software)?,
};

Ok(pattern)
Ok(pattern_project)
}
Loading

0 comments on commit 7b3ca9f

Please sign in to comment.