diff --git a/src/config.rs b/src/config.rs index 3d08530..9fd0b61 100644 --- a/src/config.rs +++ b/src/config.rs @@ -171,7 +171,7 @@ impl ConfigFile { None => HashMap::new(), }; - let default_config = (&*globals::CONFIG_NAME.read().unwrap()).to_string(); + let default_config = (&*rw_read!(globals::CONFIG_NAME)).to_string(); let config_name = if (map.len() > 1 || !map.contains_key(&default_config)) && map.len() != 0 { @@ -186,7 +186,7 @@ impl ConfigFile { }; if let Some(config) = map.get(&config_name) { - *globals::CONFIG_NAME.write().unwrap() = config_name; + *rw_write!(globals::CONFIG_NAME) = config_name; return config.to_owned(); } } @@ -194,7 +194,7 @@ impl ConfigFile { let config = Self::default(); let mut configs = HashMap::new(); configs.insert( - (&*globals::CONFIG_NAME.read().unwrap()).to_owned(), + (&*rw_read!(globals::CONFIG_NAME)).to_owned(), config.clone(), ); save_configs(configs); diff --git a/src/config_window.rs b/src/config_window.rs index 58c0049..f2fae42 100644 --- a/src/config_window.rs +++ b/src/config_window.rs @@ -510,7 +510,7 @@ impl ConfigWindow { // Show to edit config pub(crate) fn show(&mut self) -> bool { - let config_name = &*globals::CONFIG_NAME.read().unwrap(); + let config_name = &*rw_read!(globals::CONFIG_NAME); self.browse.clear(); for (idx, name) in self.configs.borrow().keys().enumerate() { self.browse.add(name); @@ -519,7 +519,7 @@ impl ConfigWindow { } } *self.selected_browse_line.borrow_mut() = self.browse.value(); - let config = globals::CONFIG.read().unwrap(); + let config = rw_read!(globals::CONFIG); self.quote_font.set_value(config.quote_font.as_str()); self.subquote_font.set_value(config.subquote_font.as_str()); self.subquote2_font @@ -1232,8 +1232,8 @@ impl ConfigWindow { self.save_btn.set_callback(move |_| { config::save_configs((*configs.borrow()).clone()); - if let Some(c) = configs.borrow().get(&*globals::CONFIG_NAME.read().unwrap()) { - *globals::CONFIG.write().unwrap() = c.to_owned(); + if let Some(c) = configs.borrow().get(&*rw_read!(globals::CONFIG_NAME)) { + *rw_write!(globals::CONFIG) = c.to_owned(); } *did_save.borrow_mut() = true; win.hide(); diff --git a/src/crop_window.rs b/src/crop_window.rs index cc2769f..a2e380f 100644 --- a/src/crop_window.rs +++ b/src/crop_window.rs @@ -113,7 +113,7 @@ impl CropWindow { let mut container = ImageContainer::new(path, Arc::new(RwLock::new(ImageProperties::default()))); { - let prop = &mut container.properties.write().unwrap(); + let prop = &mut rw_write!(container.properties); prop.dimension = prop.original_dimension; prop.crop_position = match crop_pos { Some(a) => Some(a), @@ -145,7 +145,7 @@ impl CropWindow { } if let Some(cont) = &*self.container.borrow() { - cont.properties.read().unwrap().crop_position + rw_read!(cont.properties).crop_position } else { None } @@ -168,7 +168,7 @@ impl CropWindow { ) .unwrap(); - let prop = cont.properties.read().unwrap(); + let prop = rw_read!(cont.properties); let (original_width, original_height) = prop.original_dimension; let (original_x, original_y) = prop.crop_position.unwrap(); let (resized_width, resized_height) = (image.width() as f64, image.height() as f64); @@ -200,7 +200,7 @@ impl CropWindow { if let Some(cont) = &*container.borrow_mut() { let image = &cont.buffer; - let mut prop = cont.properties.write().unwrap(); + let mut prop = rw_write!(cont.properties); let (original_x, original_y) = match prop.crop_position { Some(v) => v, @@ -271,7 +271,7 @@ impl CropWindow { let container = Rc::clone(&self.container); self.win.set_callback(move |f| { if let Some(cont) = &*container.borrow_mut() { - cont.properties.write().unwrap().crop_position = None; + rw_write!(cont.properties).crop_position = None; } f.hide(); }); diff --git a/src/draw_thread.rs b/src/draw_thread.rs index 2409166..7a365c2 100644 --- a/src/draw_thread.rs +++ b/src/draw_thread.rs @@ -185,7 +185,7 @@ pub(crate) fn spawn_image_thread( win.deactivate(); if let Some(image_info) = cont.clone_img() { let idx = file_choice.value(); - let mut imgs = images_list.write().unwrap(); + let mut imgs = rw_write!(images_list); imgs.insert(idx as usize, image_info.clone()); file_choice.insert( idx, @@ -207,7 +207,7 @@ pub(crate) fn spawn_image_thread( status.set_label("Deleting..."); win.deactivate(); cont.delete(); - let mut imgs = images_list.write().unwrap(); + let mut imgs = rw_write!(images_list); imgs.remove(file_choice.value() as usize); file_choice.remove(file_choice.value()); if file_choice.value() != imgs.len() as i32 { @@ -223,10 +223,9 @@ pub(crate) fn spawn_image_thread( } DrawMessage::ShowImagesDetails => show_images_details(Arc::clone(&images_list)), DrawMessage::CheckImage => { - let (width, height) = properties.read().unwrap().original_dimension; + let (width, height) = rw_read!(properties).original_dimension; if utils::is_too_small(width, height) { - let a = globals::MAIN_SENDER.read().unwrap(); - if let Some(a) = &*a { + if let Some(a) = &*rw_read!(globals::MAIN_SENDER) { a.send(crate::AppMessage::DeleteImage); } } @@ -265,7 +264,7 @@ fn load_image( properties: Arc>, container: &mut Option, ) { - let imgs = images_list.read().unwrap(); + let imgs = rw_read!(images_list); if imgs.len() == 0 { *container = None; flush_buffer(app_sender, container); @@ -290,7 +289,7 @@ fn load_image( } }; - let mut properties = cont.properties.write().unwrap(); + let mut properties = rw_write!(cont.properties); properties.merge(read, &tag.value(), &tag2.value()); properties.is_saved = true; @@ -344,7 +343,7 @@ fn load_image( } cont.apply_resize(); - let (width, height) = cont.properties.read().unwrap().dimension; + let (width, height) = rw_read!(cont.properties).dimension; page.col_flex.set_size(&page.image, height as i32); page.row_flex.set_size(&page.col_flex, width as i32); page.col_flex.recalc(); @@ -358,7 +357,7 @@ fn show_images_details(images_list: Arc>>) { let mut image_with_quote: usize = 0; let mut image_without_quote: usize = 0; - let list = images_list.read().unwrap(); + let list = rw_read!(images_list); for image_info in list.iter() { let properties_file = utils::get_properties_path(&image_info); diff --git a/src/globals.rs b/src/globals.rs index 91b336b..39701a1 100644 --- a/src/globals.rs +++ b/src/globals.rs @@ -29,13 +29,13 @@ lazy_static! { pub(crate) static ref CONFIG: RwLock = RwLock::new(config::ConfigFile::load()); - /// Main Sender + /// Main Sender pub(crate) static ref MAIN_SENDER: RwLock>> = RwLock::new(None); /// TTF Font for Quote pub(crate) static ref FONT_QUOTE: Font<'static> = { let mut buffer = Vec::new(); - if let Ok(mut file) = std::fs::File::open(CONFIG.read().unwrap().quote_font.as_str()) { + if let Ok(mut file) = std::fs::File::open(rw_read!(CONFIG).quote_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { return out; @@ -51,7 +51,7 @@ lazy_static! { /// TTF Font for Subquote pub(crate) static ref FONT_SUBQUOTE: Font<'static> = { let mut buffer = Vec::new(); - if let Ok(mut file) = std::fs::File::open(CONFIG.read().unwrap().subquote_font.as_str()) + if let Ok(mut file) = std::fs::File::open(rw_read!(CONFIG).subquote_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { @@ -69,7 +69,7 @@ lazy_static! { pub(crate) static ref FONT_SUBQUOTE2: Font<'static> = { let mut buffer = Vec::new(); if let Ok(mut file) = - std::fs::File::open(CONFIG.read().unwrap().subquote2_font.as_str()) + std::fs::File::open(rw_read!(CONFIG).subquote2_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { @@ -86,7 +86,7 @@ lazy_static! { /// TTF Font for Tag pub(crate) static ref FONT_TAG: Font<'static> = { let mut buffer = Vec::new(); - if let Ok(mut file) = std::fs::File::open(&CONFIG.read().unwrap().tag_font.as_str()) { + if let Ok(mut file) = std::fs::File::open(&rw_read!(CONFIG).tag_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { return out; @@ -100,7 +100,7 @@ lazy_static! { /// TTF Font for Tag 2 pub(crate) static ref FONT_TAG2: Font<'static> = { let mut buffer = Vec::new(); - if let Ok(mut file) = std::fs::File::open(&CONFIG.read().unwrap().tag2_font.as_str()) { + if let Ok(mut file) = std::fs::File::open(&rw_read!(CONFIG).tag2_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { return out; diff --git a/src/macros.rs b/src/macros.rs new file mode 100644 index 0000000..8be3875 --- /dev/null +++ b/src/macros.rs @@ -0,0 +1,13 @@ +#[macro_export] +macro_rules! rw_read { + ($var:expr) => { + $var.read().expect("Program got panic!") + }; +} + +#[macro_export] +macro_rules! rw_write { + ($var:expr) => { + $var.write().expect("Program got panic!") + }; +} diff --git a/src/main.rs b/src/main.rs index 2d63310..354bf66 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,17 +17,20 @@ extern crate log; extern crate simplelog; -mod dialog; +#[macro_use] +mod macros; + mod about_window; mod config; mod config_picker; mod config_window; mod crop_window; +mod dialog; mod draw_thread; mod globals; mod main_window; -mod utils; mod result_ext; +mod utils; use fltk::{ app::{channel, App}, @@ -47,7 +50,7 @@ pub(crate) enum AppMessage { Alert(String), // Only for Main windows - DeleteImage + DeleteImage, } fn main() { @@ -73,28 +76,32 @@ fn main() { let draw_buff: Arc>>> = Arc::new(RwLock::new(None)); let (main_sender, main_receiver) = channel::(); - *globals::MAIN_SENDER.write().unwrap() = Some(main_sender); + *rw_write!(globals::MAIN_SENDER) = Some(main_sender); let mut main_window = MainWindow::new(Arc::clone(&draw_buff)); while app.wait() { if let Some(msg) = main_receiver.recv() { match msg { AppMessage::RedrawMainWindowImage(data) => { - let mut buff = draw_buff.write().unwrap(); + let mut buff = rw_write!(draw_buff); *buff = data; main_window.win.redraw(); } AppMessage::Message(msg) => { dialog::message_default(&msg); } - AppMessage::Alert(msg) => { - dialog::alert_default(&msg) - } + AppMessage::Alert(msg) => dialog::alert_default(&msg), AppMessage::DeleteImage => { let ch = dialog::choice_default("Image is too small", "Delete", "Keep"); if ch == 0 { - main_window.sender.send(draw_thread::DrawMessage::Delete).unwrap(); - main_window.sender.send(draw_thread::DrawMessage::Open).unwrap(); + main_window + .sender + .send(draw_thread::DrawMessage::Delete) + .unwrap(); + main_window + .sender + .send(draw_thread::DrawMessage::Open) + .unwrap(); main_window.page.image.redraw(); main_window.file_choice.redraw(); } diff --git a/src/main_window.rs b/src/main_window.rs index 60ca1ce..a0337f5 100644 --- a/src/main_window.rs +++ b/src/main_window.rs @@ -397,8 +397,7 @@ impl MainWindow { sender: rx, }; - let a = globals::MAIN_SENDER.read().unwrap(); - if let Some(a) = &*a { + if let Some(a) = &*rw_read!(globals::MAIN_SENDER) { spawn_image_thread(tx, a.to_owned(), Arc::clone(&properties), &main_win); } main_win.menu(); @@ -450,7 +449,7 @@ impl MainWindow { Shortcut::Ctrl | 's', menu::MenuFlag::Normal, move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.is_saved = true; sender.send(DrawMessage::Save).unwrap(); }, @@ -498,8 +497,8 @@ impl MainWindow { let buff = Arc::clone(&self.draw_buff); let properties = Arc::clone(&self.properties); self.page.image.draw(move |f| { - let (width, height) = properties.read().unwrap().dimension; - if let Some(image) = &*buff.read().unwrap() { + let (width, height) = rw_read!(properties).dimension; + if let Some(image) = &*rw_read!(buff) { dr::draw_image( &image, f.x(), @@ -520,7 +519,7 @@ impl MainWindow { let sender = self.sender.clone(); let imgs = Arc::clone(&self.images_list); self.reset_file_choice.set_callback(move |_| { - let path = match imgs.read().unwrap().first() { + let path = match rw_read!(imgs).first() { Some(image_info) => image_info.path.parent().unwrap().to_path_buf(), None => return, }; @@ -534,8 +533,8 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.reset_translucent_layer_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); - let color = globals::CONFIG.read().unwrap().color_layer; + let mut prop = rw_write!(properties); + let color = rw_read!(globals::CONFIG).color_layer; prop.translucent_layer_color = color; prop.is_saved = false; utils::set_color_btn_rgba(color, &mut layer_rgb); @@ -552,9 +551,9 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.reset_quote_position_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); let height = prop.original_dimension.1; - let pos = height * globals::CONFIG.read().unwrap().quote_position_ratio; + let pos = height * rw_read!(globals::CONFIG).quote_position_ratio; prop.quote_position = pos; prop.is_saved = false; quote_position.set_value(pos); @@ -572,9 +571,9 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.reset_subquote_position_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); let height = prop.original_dimension.1; - let pos = height * globals::CONFIG.read().unwrap().subquote_position_ratio; + let pos = height * rw_read!(globals::CONFIG).subquote_position_ratio; prop.subquote_position = pos; prop.is_saved = false; subquote_position.set_value(pos); @@ -592,9 +591,9 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.reset_subquote2_position_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); let height = prop.original_dimension.1; - let pos = height * globals::CONFIG.read().unwrap().subquote2_position_ratio; + let pos = height * rw_read!(globals::CONFIG).subquote2_position_ratio; prop.subquote2_position = pos; prop.is_saved = false; subquote2_position.set_value(pos); @@ -612,9 +611,9 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.reset_tag_position_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); let height = prop.original_dimension.1; - let pos = height * globals::CONFIG.read().unwrap().tag_position_ratio; + let pos = height * rw_read!(globals::CONFIG).tag_position_ratio; prop.tag_position = pos; prop.is_saved = false; tag_position.set_value(pos); @@ -632,9 +631,9 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.reset_tag2_position_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); let height = prop.original_dimension.1; - let pos = height * globals::CONFIG.read().unwrap().tag2_position_ratio; + let pos = height * rw_read!(globals::CONFIG).tag2_position_ratio; prop.tag2_position = pos; prop.is_saved = false; tag2_position.set_value(pos); @@ -649,7 +648,7 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.save_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.is_saved = true; sender.send(DrawMessage::Save).unwrap() }); @@ -689,7 +688,7 @@ impl MainWindow { let mut crop_win = CropWindow::new(); let sender = self.sender.clone(); self.crop_btn.set_callback(move |_| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); if let Some(image_info) = &prop.image_info { if let Some((x, y)) = crop_win.load_to_crop(&image_info, prop.crop_position) { sender.send(DrawMessage::ChangeCrop((x, y))).unwrap(); @@ -703,7 +702,7 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.next_btn.set_callback(move |_| { - let prop = properties.read().unwrap(); + let prop = rw_read!(properties); if !prop.is_saved { let save = fltk::dialog::choice_default("Save?", "yes", "no", "cancel"); match save { @@ -727,7 +726,7 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.back_btn.set_callback(move |_| { - let prop = properties.read().unwrap(); + let prop = rw_read!(properties); if !prop.is_saved { let save = fltk::dialog::choice_default("Save?", "yes", "no", "cancel"); match save { @@ -750,7 +749,7 @@ impl MainWindow { let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.file_choice.set_callback(move |_| { - let prop = properties.read().unwrap(); + let prop = rw_read!(properties); if !prop.is_saved { let save = fltk::dialog::choice_default("Save?", "yes", "no", "cancel"); match save { @@ -769,7 +768,7 @@ impl MainWindow { let sender = self.sender.clone(); self.quote.handle(move |f, ev| { if ev == enums::Event::KeyUp { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.quote = f.value(); prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -785,7 +784,7 @@ impl MainWindow { let sender = self.sender.clone(); self.subquote.handle(move |f, ev| { if ev == enums::Event::KeyUp { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.subquote = f.value(); prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -801,7 +800,7 @@ impl MainWindow { let sender = self.sender.clone(); self.subquote2.handle(move |f, ev| { if ev == enums::Event::KeyUp { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.subquote2 = f.value(); prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -817,7 +816,7 @@ impl MainWindow { let sender = self.sender.clone(); self.tag.handle(move |f, ev| { if ev == enums::Event::KeyUp { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.tag = f.value(); prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -833,7 +832,7 @@ impl MainWindow { let sender = self.sender.clone(); self.tag2.handle(move |f, ev| { if ev == enums::Event::KeyUp { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.tag2 = f.value(); prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -849,7 +848,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut quote_position_slider = self.quote_position_slider.clone(); self.quote_position.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.quote_position = f.value(); quote_position_slider.set_value(f.value()); prop.is_saved = false; @@ -864,7 +863,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut quote_position = self.quote_position.clone(); self.quote_position_slider.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.quote_position = f.value(); quote_position.set_value(f.value()); prop.is_saved = false; @@ -879,7 +878,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut subquote_position_slider = self.subquote_position_slider.clone(); self.subquote_position.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.subquote_position = f.value(); subquote_position_slider.set_value(f.value()); prop.is_saved = false; @@ -894,7 +893,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut subquote_position = self.subquote_position.clone(); self.subquote_position_slider.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.subquote_position = f.value(); subquote_position.set_value(f.value()); prop.is_saved = false; @@ -909,7 +908,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut subquote2_position_slider = self.subquote2_position_slider.clone(); self.subquote2_position.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.subquote2_position = f.value(); subquote2_position_slider.set_value(f.value()); prop.is_saved = false; @@ -924,7 +923,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut subquote2_position = self.subquote2_position.clone(); self.subquote2_position_slider.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.subquote2_position = f.value(); subquote2_position.set_value(f.value()); prop.is_saved = false; @@ -939,7 +938,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut tag_position_slider = self.tag_position_slider.clone(); self.tag_position.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.tag_position = f.value(); tag_position_slider.set_value(f.value()); prop.is_saved = false; @@ -954,7 +953,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut tag_position = self.tag_position.clone(); self.tag_position_slider.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.tag_position = f.value(); tag_position.set_value(f.value()); prop.is_saved = false; @@ -969,7 +968,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut tag2_position_slider = self.tag2_position_slider.clone(); self.tag2_position.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.tag2_position = f.value(); tag2_position_slider.set_value(f.value()); prop.is_saved = false; @@ -984,7 +983,7 @@ impl MainWindow { let sender = self.sender.clone(); let mut tag2_position = self.tag2_position.clone(); self.tag2_position_slider.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.tag2_position = f.value(); tag2_position.set_value(f.value()); prop.is_saved = false; @@ -998,7 +997,7 @@ impl MainWindow { let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); self.translucent_layer_rgb.set_callback(move |mut f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); let (r, g, b) = dialog::color_chooser_with_default( "Pick a colour", dialog::ColorMode::Byte, @@ -1022,7 +1021,7 @@ impl MainWindow { let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); self.translucent_layer_alpha.set_callback(move |f| { - let mut prop = properties.write().unwrap(); + let mut prop = rw_write!(properties); prop.translucent_layer_color[3] = f.value() as u8; prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -1045,7 +1044,7 @@ fn load_dir( .collect::>(); files.sort_by_key(|i| i.file_name()); let mut text = String::new(); - let mut imgs_b = imgs.write().unwrap(); + let mut imgs_b = rw_write!(imgs); *imgs_b = vec![]; for file in files { let path = file.path(); diff --git a/src/utils.rs b/src/utils.rs index 731152b..6efdf85 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -119,8 +119,8 @@ impl ImageContainer { let img = load_image(&image_info); let (width, height): (f64, f64) = Coord::from(img.dimensions()).into(); - let config = globals::CONFIG.read().unwrap(); - let mut prop = properties.write().unwrap(); + let config = rw_read!(globals::CONFIG); + let mut prop = rw_write!(properties); prop.image_info = Some(image_info.to_owned()); prop.original_dimension = (width, height); prop.quote_position = height * config.quote_position_ratio; @@ -138,7 +138,7 @@ impl ImageContainer { /// Resize image pub(crate) fn apply_resize(&mut self) { - let mut prop = self.properties.write().unwrap(); + let mut prop = rw_write!(self.properties); let (width, height) = prop.dimension; let (s_width, s_height) = ((width * 500.0) / height, 500.0); @@ -150,7 +150,7 @@ impl ImageContainer { /// Crop Image pub(crate) fn apply_crop(&mut self) { - let mut prop = self.properties.write().unwrap(); + let mut prop = rw_write!(self.properties); let (original_width, original_height) = prop.original_dimension; let (origina_crop_width, origina_crop_height) = croped_ratio(original_width, original_height); @@ -173,7 +173,7 @@ impl ImageContainer { } pub(crate) fn apply_crop_position(&mut self, original_x: f64, original_y: f64) { - let mut prop = self.properties.write().unwrap(); + let mut prop = rw_write!(self.properties); let (original_width, original_height) = prop.original_dimension; prop.crop_position = Some((original_x, original_y)); @@ -195,7 +195,7 @@ impl ImageContainer { /// Redraw: Copy image from main image to buffer and draw text and all on it pub(crate) fn redraw_to_buffer(&mut self) { - let prop = self.properties.read().unwrap(); + let prop = rw_read!(self.properties); let mut tmp = self.image.clone(); draw_layer_and_text( @@ -219,7 +219,7 @@ impl ImageContainer { /// Save image and properities pub(crate) fn save(&self) { - let prop = self.properties.read().unwrap(); + let prop = rw_read!(self.properties); let image_info = &prop.image_info; let (export_path, path_properties, mut original_image) = match image_info { Some(p) => ( @@ -229,7 +229,7 @@ impl ImageContainer { ), None => return, }; - let config = globals::CONFIG.read().unwrap(); + let config = rw_read!(globals::CONFIG); let export_format = &config.image_format; let mut prop = prop.clone(); @@ -327,7 +327,7 @@ impl ImageContainer { } pub(crate) fn clone_img(&self) -> Option { - let prop = self.properties.read().unwrap(); + let prop = rw_read!(self.properties); match &prop.image_info { Some(image_info) => { @@ -360,7 +360,7 @@ impl ImageContainer { } pub(crate) fn delete(&self) { - let prop = self.properties.read().unwrap(); + let prop = rw_read!(self.properties); let image_info = &prop.image_info; let (export_path, path_image, path_properties) = match image_info { @@ -505,7 +505,7 @@ impl ImageProperties { self.tag2_position = props.tag2_position.unwrap_or(self.tag2_position); self.translucent_layer_color = props .translucent_layer_color - .unwrap_or(globals::CONFIG.read().unwrap().color_layer); + .unwrap_or(rw_read!(globals::CONFIG).color_layer); } } @@ -704,7 +704,7 @@ pub(crate) fn get_properties_path(image_info: &ImageInfo) -> PathBuf { /// path of properties files pub(crate) fn get_export_image_path(image_info: &ImageInfo) -> PathBuf { - let config = globals::CONFIG.read().unwrap(); + let config = rw_read!(globals::CONFIG); let export_format = &config.image_format; let mut export = image_info .path @@ -740,7 +740,7 @@ pub(crate) fn set_color_btn_rgba(rgba: [u8; 4], btn: &mut Button) { /// Check if image is too small pub(crate) fn is_too_small(width: f64, height: f64) -> bool { let (crop_width, _) = croped_ratio(width, height); - if crop_width < globals::CONFIG.read().unwrap().minimum_width_limit { + if crop_width < rw_read!(globals::CONFIG).minimum_width_limit { true } else { false @@ -758,50 +758,50 @@ pub(crate) fn croped_ratio(width: f64, height: f64) -> (f64, f64) { /// Get required witdh to crop image from height as per image ratio pub(crate) fn width_from_height(height: f64) -> f64 { - let (w, h) = globals::CONFIG.read().unwrap().image_ratio; + let (w, h) = rw_read!(globals::CONFIG).image_ratio; (w * height) / h } /// Get required height to crop image from width as per image ratio pub(crate) fn height_from_width(width: f64) -> f64 { - let (w, h) = globals::CONFIG.read().unwrap().image_ratio; + let (w, h) = rw_read!(globals::CONFIG).image_ratio; (h * width) / w } /// Get required quote size for crop image from height as per image ratio pub(crate) fn quote_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().quote_font_ratio) / 5000.0 + (height * rw_read!(globals::CONFIG).quote_font_ratio) / 5000.0 } /// Get required subquote size for crop image from height as per image ratio pub(crate) fn subquote_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().subquote_font_ratio) / 5000.0 + (height * rw_read!(globals::CONFIG).subquote_font_ratio) / 5000.0 } /// Get required subquote2 size for crop image from height as per image ratio pub(crate) fn subquote2_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().subquote2_font_ratio) / 5000.0 + (height * rw_read!(globals::CONFIG).subquote2_font_ratio) / 5000.0 } /// Get required tag size for crop image from height as per image ratio pub(crate) fn tag_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().tag_font_ratio) / 5000.0 + (height * rw_read!(globals::CONFIG).tag_font_ratio) / 5000.0 } /// Get required tag2 size for crop image from height as per image ratio pub(crate) fn tag2_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().tag2_font_ratio) / 5000.0 + (height * rw_read!(globals::CONFIG).tag2_font_ratio) / 5000.0 } pub(crate) fn show_message(msg: &str) { - let a = globals::MAIN_SENDER.read().unwrap(); + let a = rw_read!(globals::MAIN_SENDER); if let Some(a) = &*a { a.send(crate::AppMessage::Message(msg.to_owned())); } } pub(crate) fn show_alert(msg: &str) { - let a = globals::MAIN_SENDER.read().unwrap(); + let a = rw_read!(globals::MAIN_SENDER); if let Some(a) = &*a { a.send(crate::AppMessage::Alert(msg.to_owned())); }