Fixes:
1) image naming format 2) panic message shown at end 4) some messages changed
This commit is contained in:
parent
8a194a254f
commit
e241ac7ff5
|
|
@ -18,6 +18,7 @@ use crate::{
|
||||||
config::{self, ConfigFile},
|
config::{self, ConfigFile},
|
||||||
dialog, globals,
|
dialog, globals,
|
||||||
utils::{self, ImageType},
|
utils::{self, ImageType},
|
||||||
|
result_ext::ResultExt
|
||||||
};
|
};
|
||||||
use fltk::{
|
use fltk::{
|
||||||
app,
|
app,
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
//! Window to change Crop properties of image
|
//! Window to change Crop properties of image
|
||||||
use crate::{
|
use crate::{
|
||||||
globals,
|
globals,
|
||||||
|
result_ext::ResultExt,
|
||||||
utils::{self, Coord, ImageContainer, ImageInfo, ImageProperties},
|
utils::{self, Coord, ImageContainer, ImageInfo, ImageProperties},
|
||||||
};
|
};
|
||||||
use fltk::{
|
use fltk::{
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
along with Post Maker. If not, see <https://www.gnu.org/licenses/>
|
along with Post Maker. If not, see <https://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use crate::config;
|
use crate::{config, result_ext::ResultExt};
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use rusttype::Font;
|
use rusttype::Font;
|
||||||
use std::{ffi::OsString, io::Read, sync::RwLock};
|
use std::{ffi::OsString, io::Read, sync::RwLock};
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! rw_read {
|
macro_rules! rw_read {
|
||||||
($var:expr) => {
|
($var:expr) => {
|
||||||
$var.read().expect("Program got panic!")
|
$var.read().expect_log("Program got panic!")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! rw_write {
|
macro_rules! rw_write {
|
||||||
($var:expr) => {
|
($var:expr) => {
|
||||||
$var.write().expect("Program got panic!")
|
$var.write().expect_log("Program got panic!")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,11 +34,11 @@ mod utils;
|
||||||
|
|
||||||
use fltk::{
|
use fltk::{
|
||||||
app::{channel, App},
|
app::{channel, App},
|
||||||
// dialog,
|
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
use fltk_theme::WidgetTheme;
|
use fltk_theme::WidgetTheme;
|
||||||
use main_window::MainWindow;
|
use main_window::MainWindow;
|
||||||
|
use result_ext::ResultExt;
|
||||||
use simplelog::*;
|
use simplelog::*;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
|
|
@ -48,6 +48,7 @@ pub(crate) enum AppMessage {
|
||||||
RedrawMainWindowImage(Option<Vec<u8>>),
|
RedrawMainWindowImage(Option<Vec<u8>>),
|
||||||
Message(String),
|
Message(String),
|
||||||
Alert(String),
|
Alert(String),
|
||||||
|
ProgramPanicMessage(String),
|
||||||
|
|
||||||
// Only for Main windows
|
// Only for Main windows
|
||||||
DeleteImage,
|
DeleteImage,
|
||||||
|
|
@ -91,6 +92,10 @@ fn main() {
|
||||||
dialog::message_default(&msg);
|
dialog::message_default(&msg);
|
||||||
}
|
}
|
||||||
AppMessage::Alert(msg) => dialog::alert_default(&msg),
|
AppMessage::Alert(msg) => dialog::alert_default(&msg),
|
||||||
|
AppMessage::ProgramPanicMessage(msg) => {
|
||||||
|
dialog::message_default(&msg);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
AppMessage::DeleteImage => {
|
AppMessage::DeleteImage => {
|
||||||
let ch = dialog::choice_default("Image is too small", "Delete", "Keep");
|
let ch = dialog::choice_default("Image is too small", "Delete", "Keep");
|
||||||
if ch == 0 {
|
if ch == 0 {
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,9 @@ impl<T, E: Debug> ResultExt<T, E> for Result<T, E> {
|
||||||
match self {
|
match self {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
utils::show_alert(msg);
|
|
||||||
error!("{}\n{:?}\n{}", msg, e, Location::caller());
|
error!("{}\n{:?}\n{}", msg, e, Location::caller());
|
||||||
std::process::exit(1);
|
utils::show_program_panic(msg);
|
||||||
|
panic!("[panic]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -24,16 +24,16 @@ impl<T, E: Debug> ResultExt<T, E> for Result<T, E> {
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn error_log(&self, msg: &str) {
|
fn error_log(&self, msg: &str) {
|
||||||
if let Err(e) = self {
|
if let Err(e) = self {
|
||||||
utils::show_alert(msg);
|
|
||||||
error!("{}\n{:?}\n{}", msg, e, Location::caller());
|
error!("{}\n{:?}\n{}", msg, e, Location::caller());
|
||||||
|
utils::show_alert(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn warn_log(&self, msg: &str) {
|
fn warn_log(&self, msg: &str) {
|
||||||
if let Err(e) = self {
|
if let Err(e) = self {
|
||||||
utils::show_alert(msg);
|
|
||||||
warn!("{}\n{:?}", msg, e);
|
warn!("{}\n{:?}", msg, e);
|
||||||
|
utils::show_alert(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
95
src/utils.rs
95
src/utils.rs
|
|
@ -513,7 +513,7 @@ impl ImageProperties {
|
||||||
fn load_image(image_info: &ImageInfo) -> DynamicImage {
|
fn load_image(image_info: &ImageInfo) -> DynamicImage {
|
||||||
let img = match image_info.image_type {
|
let img = match image_info.image_type {
|
||||||
ImageType::Webp => {
|
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![];
|
let mut buf = vec![];
|
||||||
f.read_to_end(&mut buf).expect_log("Failed to read image!");
|
f.read_to_end(&mut buf).expect_log("Failed to read image!");
|
||||||
let a = webp::Decoder::new(&buf)
|
let a = webp::Decoder::new(&buf)
|
||||||
|
|
@ -523,14 +523,14 @@ fn load_image(image_info: &ImageInfo) -> DynamicImage {
|
||||||
a.to_image()
|
a.to_image()
|
||||||
}
|
}
|
||||||
ImageType::Jpeg => {
|
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![];
|
let mut buf = vec![];
|
||||||
f.read_to_end(&mut buf).expect_log("Failed to read image!");
|
f.read_to_end(&mut buf).expect_log("Failed to read image!");
|
||||||
|
|
||||||
let d = mozjpeg::Decompress::with_markers(mozjpeg::ALL_MARKERS)
|
let d = mozjpeg::Decompress::with_markers(mozjpeg::ALL_MARKERS)
|
||||||
.from_mem(&buf)
|
.from_mem(&buf)
|
||||||
.expect_log("Failed to decompress image!");
|
.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 pixels = image.read_scanlines_flat().unwrap();
|
||||||
let image =
|
let image =
|
||||||
ImageBuffer::from_raw(image.width() as u32, image.height() as u32, pixels).unwrap();
|
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 => {
|
ImageType::Png => {
|
||||||
let dec = image::codecs::png::PngDecoder::new(
|
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!");
|
.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 => {
|
ImageType::None => {
|
||||||
Result::<(), _>::Err("Failed to open image!").expect_log("");
|
Result::<(), _>::Err("Failed to load image!").expect_log("Unknown format!");
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -680,11 +680,33 @@ pub(crate) fn measure_line(
|
||||||
/// path of properties files
|
/// path of properties files
|
||||||
pub(crate) fn get_properties_path(image_info: &ImageInfo) -> PathBuf {
|
pub(crate) fn get_properties_path(image_info: &ImageInfo) -> PathBuf {
|
||||||
let img = &image_info.path;
|
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));
|
let image_name: String = image_info
|
||||||
default_path.set_extension("prop");
|
.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::<Vec<char>>()
|
||||||
|
.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() {
|
if default_path.exists() {
|
||||||
return default_path;
|
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 {
|
pub(crate) fn get_export_image_path(image_info: &ImageInfo) -> PathBuf {
|
||||||
let config = rw_read!(globals::CONFIG);
|
let config = rw_read!(globals::CONFIG);
|
||||||
let export_format = &config.image_format;
|
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::<Vec<char>>()
|
||||||
|
.into_iter()
|
||||||
|
.rev();
|
||||||
|
let image_name = format!(
|
||||||
|
"{}.{}",
|
||||||
|
String::from_iter(image_name),
|
||||||
|
export_format.as_extension()
|
||||||
|
);
|
||||||
|
|
||||||
|
let export = image_info
|
||||||
.path
|
.path
|
||||||
.parent()
|
.parent()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.join("export")
|
.join("export")
|
||||||
.join(format!(
|
.join(&image_name);
|
||||||
"{}-{}",
|
|
||||||
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());
|
|
||||||
export
|
export
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -806,3 +844,10 @@ pub(crate) fn show_alert(msg: &str) {
|
||||||
a.send(crate::AppMessage::Alert(msg.to_owned()));
|
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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue