diff --git a/src/config_window.rs b/src/config_window.rs
index f2fae42..cdc4130 100644
--- a/src/config_window.rs
+++ b/src/config_window.rs
@@ -18,6 +18,7 @@ use crate::{
config::{self, ConfigFile},
dialog, globals,
utils::{self, ImageType},
+ result_ext::ResultExt
};
use fltk::{
app,
diff --git a/src/crop_window.rs b/src/crop_window.rs
index a2e380f..bd6a4d2 100644
--- a/src/crop_window.rs
+++ b/src/crop_window.rs
@@ -15,6 +15,7 @@
//! Window to change Crop properties of image
use crate::{
globals,
+ result_ext::ResultExt,
utils::{self, Coord, ImageContainer, ImageInfo, ImageProperties},
};
use fltk::{
diff --git a/src/globals.rs b/src/globals.rs
index 39701a1..657c113 100644
--- a/src/globals.rs
+++ b/src/globals.rs
@@ -12,7 +12,7 @@
along with Post Maker. If not, see
*/
-use crate::config;
+use crate::{config, result_ext::ResultExt};
use lazy_static::lazy_static;
use rusttype::Font;
use std::{ffi::OsString, io::Read, sync::RwLock};
diff --git a/src/macros.rs b/src/macros.rs
index 8be3875..3dd30ad 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -1,13 +1,13 @@
#[macro_export]
macro_rules! rw_read {
($var:expr) => {
- $var.read().expect("Program got panic!")
+ $var.read().expect_log("Program got panic!")
};
}
#[macro_export]
macro_rules! rw_write {
($var:expr) => {
- $var.write().expect("Program got panic!")
+ $var.write().expect_log("Program got panic!")
};
}
diff --git a/src/main.rs b/src/main.rs
index 354bf66..8f21f61 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -34,11 +34,11 @@ mod utils;
use fltk::{
app::{channel, App},
- // dialog,
prelude::*,
};
use fltk_theme::WidgetTheme;
use main_window::MainWindow;
+use result_ext::ResultExt;
use simplelog::*;
use std::sync::{Arc, RwLock};
@@ -48,6 +48,7 @@ pub(crate) enum AppMessage {
RedrawMainWindowImage(Option>),
Message(String),
Alert(String),
+ ProgramPanicMessage(String),
// Only for Main windows
DeleteImage,
@@ -91,6 +92,10 @@ fn main() {
dialog::message_default(&msg);
}
AppMessage::Alert(msg) => dialog::alert_default(&msg),
+ AppMessage::ProgramPanicMessage(msg) => {
+ dialog::message_default(&msg);
+ std::process::exit(1);
+ }
AppMessage::DeleteImage => {
let ch = dialog::choice_default("Image is too small", "Delete", "Keep");
if ch == 0 {
diff --git a/src/result_ext.rs b/src/result_ext.rs
index 120a07d..77be7ad 100644
--- a/src/result_ext.rs
+++ b/src/result_ext.rs
@@ -14,9 +14,9 @@ impl ResultExt for Result {
match self {
Ok(v) => v,
Err(e) => {
- utils::show_alert(msg);
error!("{}\n{:?}\n{}", msg, e, Location::caller());
- std::process::exit(1);
+ utils::show_program_panic(msg);
+ panic!("[panic]");
}
}
}
@@ -24,16 +24,16 @@ impl ResultExt for Result {
#[track_caller]
fn error_log(&self, msg: &str) {
if let Err(e) = self {
- utils::show_alert(msg);
error!("{}\n{:?}\n{}", msg, e, Location::caller());
+ utils::show_alert(msg);
}
}
#[track_caller]
fn warn_log(&self, msg: &str) {
if let Err(e) = self {
- utils::show_alert(msg);
warn!("{}\n{:?}", msg, e);
+ utils::show_alert(msg);
}
}
}
diff --git a/src/utils.rs b/src/utils.rs
index 6efdf85..df476da 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -513,7 +513,7 @@ impl ImageProperties {
fn load_image(image_info: &ImageInfo) -> DynamicImage {
let img = match image_info.image_type {
ImageType::Webp => {
- let mut f = File::open(&image_info.path).expect_log("Failed to open image!");
+ let mut f = File::open(&image_info.path).expect_log("Failed to load image!");
let mut buf = vec![];
f.read_to_end(&mut buf).expect_log("Failed to read image!");
let a = webp::Decoder::new(&buf)
@@ -523,14 +523,14 @@ fn load_image(image_info: &ImageInfo) -> DynamicImage {
a.to_image()
}
ImageType::Jpeg => {
- let mut f = File::open(&image_info.path).expect_log("Failed to open image!");
+ let mut f = File::open(&image_info.path).expect_log("Failed to load image!");
let mut buf = vec![];
f.read_to_end(&mut buf).expect_log("Failed to read image!");
let d = mozjpeg::Decompress::with_markers(mozjpeg::ALL_MARKERS)
.from_mem(&buf)
.expect_log("Failed to decompress image!");
- let mut image = d.rgb().expect_log("Failed to covert to rgb image!");
+ let mut image = d.rgb().expect_log("Failed to convert to rgb image!");
let pixels = image.read_scanlines_flat().unwrap();
let image =
ImageBuffer::from_raw(image.width() as u32, image.height() as u32, pixels).unwrap();
@@ -538,13 +538,13 @@ fn load_image(image_info: &ImageInfo) -> DynamicImage {
}
ImageType::Png => {
let dec = image::codecs::png::PngDecoder::new(
- File::open(&image_info.path).expect_log("Failed to open image!"),
+ File::open(&image_info.path).expect_log("Failed to load image!"),
)
.expect_log("Failed to decode image!");
- DynamicImage::from_decoder(dec).expect_log("Failed to open image!")
+ DynamicImage::from_decoder(dec).expect_log("Failed to decode image!")
}
ImageType::None => {
- Result::<(), _>::Err("Failed to open image!").expect_log("");
+ Result::<(), _>::Err("Failed to load image!").expect_log("Unknown format!");
std::process::exit(1);
}
};
@@ -680,11 +680,33 @@ pub(crate) fn measure_line(
/// path of properties files
pub(crate) fn get_properties_path(image_info: &ImageInfo) -> PathBuf {
let img = &image_info.path;
- let stem = String::from(img.file_stem().unwrap_or_default().to_string_lossy());
- let extension = String::from(img.extension().unwrap_or_default().to_string_lossy());
- let mut default_path = img.with_file_name(format!("{}-{}", stem, extension));
- default_path.set_extension("prop");
+ let image_name: String = image_info
+ .path
+ .file_name()
+ .unwrap_or_default()
+ .to_string_lossy()
+ .into_owned();
+
+ let mut occurance = 0;
+ let image_name = image_name
+ .chars()
+ .into_iter()
+ .rev()
+ .map(|c| {
+ if occurance == 0 && c == '.' {
+ occurance = 1;
+ '-'
+ } else {
+ c
+ }
+ })
+ .collect::>()
+ .into_iter()
+ .rev();
+ let image_name = format!("{}.prop", String::from_iter(image_name));
+
+ let default_path = img.with_file_name(&image_name);
if default_path.exists() {
return default_path;
@@ -706,25 +728,41 @@ pub(crate) fn get_properties_path(image_info: &ImageInfo) -> PathBuf {
pub(crate) fn get_export_image_path(image_info: &ImageInfo) -> PathBuf {
let config = rw_read!(globals::CONFIG);
let export_format = &config.image_format;
- let mut export = image_info
+ let image_name = image_info
+ .path
+ .file_name()
+ .unwrap_or_default()
+ .to_string_lossy();
+
+ let mut occurance = 0;
+ let image_name = image_name
+ .chars()
+ .into_iter()
+ .rev()
+ .map(|c| {
+ if occurance == 0 && c == '.' {
+ occurance = 1;
+ '-'
+ } else {
+ c
+ }
+ })
+ .collect::>()
+ .into_iter()
+ .rev();
+ let image_name = format!(
+ "{}.{}",
+ String::from_iter(image_name),
+ export_format.as_extension()
+ );
+
+ let export = image_info
.path
.parent()
.unwrap()
.join("export")
- .join(format!(
- "{}-{}",
- image_info
- .path
- .file_stem()
- .unwrap_or_default()
- .to_string_lossy(),
- image_info
- .path
- .extension()
- .unwrap_or_default()
- .to_string_lossy()
- ));
- export.set_extension(export_format.as_extension());
+ .join(&image_name);
+
export
}
@@ -806,3 +844,10 @@ pub(crate) fn show_alert(msg: &str) {
a.send(crate::AppMessage::Alert(msg.to_owned()));
}
}
+
+pub(crate) fn show_program_panic(msg: &str) {
+ let a = rw_read!(globals::MAIN_SENDER);
+ if let Some(a) = &*a {
+ a.send(crate::AppMessage::ProgramPanicMessage(msg.to_owned()));
+ }
+}