use anyhow::Result;
use clap::Parser;
use std::path::Path;
mod file_manager;
mod gui;
mod image_processor;
use file_manager::FileManager;
use gui::RectSelector;
use image_processor::ImageProcessor;
#[derive(Parser)]
#[command(name = "assext")]
#[command(about = "Asset文件扩展工具 - 在指定区域生成数字")]
struct Args {
#[arg(help = "Spine文件路径,例如: ./data/lixiaolong")]
spine_path: String,
#[arg(help = "输出目录,例如: output")]
output_dir: String,
#[arg(help = "生成的文件数量,例如: 3")]
count: u32,
}
fn main() -> Result<()> {
let args = Args::parse();
let atlas_path = format!("{}.atlas", args.spine_path);
let png_path = format!("{}.png", args.spine_path);
let skel_path = format!("{}.skel", args.spine_path);
if !Path::new(&png_path).exists() {
anyhow::bail!("PNG file does not exist: {}", png_path);
}
let has_atlas = Path::new(&atlas_path).exists();
let has_skel = Path::new(&skel_path).exists();
let spine_name = Path::new(&args.spine_path)
.file_stem()
.unwrap()
.to_string_lossy()
.to_string();
let rect = RectSelector::select_rect(&png_path)?;
println!(
"Selected rectangle region: x={}, y={}, width={}, height={}",
rect.x, rect.y, rect.width, rect.height
);
let file_manager = FileManager::new(&args.output_dir, &spine_name, has_atlas || has_skel);
file_manager.create_output_dirs(args.count)?;
let image_processor = ImageProcessor::new(&png_path);
for i in 1..=args.count {
let (dir_name, number_text) = if args.count > 99 {
let formatted_num = format!("{:03}", i);
(format!("{}_{}", spine_name, formatted_num), formatted_num)
} else {
let formatted_num = format!("{:02}", i);
(format!("{}_{}", spine_name, formatted_num), formatted_num)
};
file_manager.copy_files(&dir_name, &atlas_path, &skel_path, has_atlas, has_skel)?;
let output_png_path = if has_atlas || has_skel {
format!("{}/{}/{}.png", args.output_dir, dir_name, spine_name)
} else {
format!("{}/{}_{}.png", args.output_dir, spine_name, number_text)
};
image_processor.draw_text_in_rect_with_color_variation(
&output_png_path,
&number_text,
&rect,
rect.enable_color_variation,
0.0, i,
)?;
}
if has_atlas || has_skel {
println!(
"Processing completed! Generated {} directories.",
args.count
);
} else {
println!(
"Processing completed! Generated {} image files in output directory.",
args.count
);
}
Ok(())
}