diff --git a/src/draw_thread.rs b/src/draw_thread.rs index 2c3a251..7d1ea32 100644 --- a/src/draw_thread.rs +++ b/src/draw_thread.rs @@ -161,7 +161,7 @@ fn load_image( prop.quote = saved_prop.quote; prop.tag = saved_prop.tag; prop.quote_position = saved_prop.quote_position; - prop.tag_position = saved_prop.quote_position; + prop.tag_position = saved_prop.tag_position; prop.rgba = saved_prop.rgba; prop.is_saved = true; use_defaults = false; diff --git a/src/main_window.rs b/src/main_window.rs index 0c8dcce..87d9942 100644 --- a/src/main_window.rs +++ b/src/main_window.rs @@ -35,6 +35,9 @@ pub(crate) struct MainWindow { pub(crate) layer_alpha: Spinner, pub(crate) quote_position: Spinner, pub(crate) tag_position: Spinner, + pub(crate) reset_darklayer_btn: Button, + pub(crate) reset_quote_position_btn: Button, + pub(crate) reset_tag_position_btn: Button, pub(crate) crop_btn: Button, pub(crate) status: Frame, pub(crate) page: Page, @@ -82,7 +85,7 @@ impl MainWindow { &Frame::default() .with_label("Quote:") .with_align(enums::Align::Left | enums::Align::Inside), - 20, + 30, ); let quote = MultilineInput::default(); controls_flex.set_size("e, 90); @@ -90,50 +93,58 @@ impl MainWindow { &Frame::default() .with_label("Tag:") .with_align(enums::Align::Left | enums::Align::Inside), - 20, + 30, ); let tag = Input::default(); controls_flex.set_size(&tag, 30); - controls_flex.set_size( - &Frame::default() - .with_label("Dark Layer (RGBA):") - .with_align(enums::Align::Left | enums::Align::Inside), - 20, - ); + + let mut darklayer_head_flex = Flex::default().row(); + Frame::default() + .with_label("Dark Layer (RGBA):") + .with_align(enums::Align::Left | enums::Align::Inside); + let reset_darklayer_btn = Button::default().with_label("@returnarrow"); + darklayer_head_flex.set_size(&reset_darklayer_btn, 30); + darklayer_head_flex.end(); + controls_flex.set_size(&darklayer_head_flex, 30); + let mut darklayer_flex = Flex::default().row(); darklayer_flex.set_pad(2); darklayer_flex.set_size(&Frame::default().with_label("Red"), 30); let mut layer_red = Spinner::default(); layer_red.set_range(0.0, 255.0); - darklayer_flex.set_size(&layer_red, 50); + // darklayer_flex.set_size(&layer_red, 50); darklayer_flex.set_size(&Frame::default().with_label("Green"), 40); let mut layer_green = Spinner::default(); layer_green.set_range(0.0, 255.0); - darklayer_flex.set_size(&layer_green, 50); + // darklayer_flex.set_size(&layer_green, 50); darklayer_flex.set_size(&Frame::default().with_label("Blue"), 30); let mut layer_blue = Spinner::default(); layer_blue.set_range(0.0, 255.0); - darklayer_flex.set_size(&layer_blue, 50); + // darklayer_flex.set_size(&layer_blue, 50); darklayer_flex.set_size(&Frame::default().with_label("Alpha"), 40); let mut layer_alpha = Spinner::default(); layer_alpha.set_range(0.0, 255.0); - darklayer_flex.set_size(&layer_alpha, 50); + // darklayer_flex.set_size(&layer_alpha, 50); darklayer_flex.end(); controls_flex.set_size(&darklayer_flex, 30); - let quote_position_flex = Flex::default().row(); + let mut quote_position_flex = Flex::default().row(); Frame::default() .with_label("Quote Position:") .with_align(enums::Align::Left | enums::Align::Inside); let quote_position = fltk::misc::Spinner::default(); + let reset_quote_position_btn = Button::default().with_label("@returnarrow"); + quote_position_flex.set_size(&reset_quote_position_btn, 30); quote_position_flex.end(); controls_flex.set_size("e_position_flex, 30); - let tag_position_flex = Flex::default().row(); + let mut tag_position_flex = Flex::default().row(); Frame::default() .with_label("Tag Position:") .with_align(enums::Align::Left | enums::Align::Inside); let tag_position = fltk::misc::Spinner::default(); + let reset_tag_position_btn = Button::default().with_label("@returnarrow"); + tag_position_flex.set_size(&reset_tag_position_btn, 30); tag_position_flex.end(); controls_flex.set_size(&tag_position_flex, 30); @@ -190,6 +201,9 @@ impl MainWindow { layer_alpha, quote_position, tag_position, + reset_darklayer_btn, + reset_quote_position_btn, + reset_tag_position_btn, crop_btn, status, draw_buff, @@ -254,15 +268,21 @@ impl MainWindow { ); let sender = self.sender.clone(); + let properties = Arc::clone(&self.properties); self.menubar.add( "&File/Save...\t", Shortcut::Ctrl | 's', menu::MenuFlag::Normal, - move |_| sender.send(DrawMessage::Save).unwrap(), + move |_| { + let mut prop = properties.write().unwrap(); + prop.is_saved = true; + sender.send(DrawMessage::Save).unwrap(); + }, ); let mut config_window = ConfigWindow::new(); let sender = self.sender.clone(); + let mut image = self.page.image.clone(); self.menubar.add( "&Edit/Configure...\t", Shortcut::None, @@ -270,6 +290,8 @@ impl MainWindow { move |_| { if config_window.show() { sender.send(DrawMessage::Recalc).unwrap(); + sender.send(DrawMessage::Flush).unwrap(); + image.redraw(); } }, ); @@ -294,9 +316,68 @@ impl MainWindow { } fn events(&mut self) { + let mut layer_red = self.layer_red.clone(); + let mut layer_green = self.layer_green.clone(); + let mut layer_blue = self.layer_blue.clone(); + let mut layer_alpha = self.layer_alpha.clone(); + let mut image = self.page.image.clone(); let sender = self.sender.clone(); - self.save_btn - .set_callback(move |_| sender.send(DrawMessage::Save).unwrap()); + let properties = Arc::clone(&self.properties); + self.reset_darklayer_btn.set_callback(move |_| { + let mut prop = properties.write().unwrap(); + let color = globals::CONFIG.read().unwrap().color_layer; + prop.rgba = color; + prop.is_saved = false; + layer_red.set_value(color[0] as f64); + layer_green.set_value(color[1] as f64); + layer_blue.set_value(color[2] as f64); + layer_alpha.set_value(color[3] as f64); + sender.send(DrawMessage::Recalc).unwrap(); + sender.send(DrawMessage::Flush).unwrap(); + image.redraw(); + }); + + let mut quote_position = self.quote_position.clone(); + let mut image = self.page.image.clone(); + 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 height = prop.original_dimension.1; + let pos = (height * 2.0) / 3.0; + prop.quote_position = pos; + prop.is_saved = false; + quote_position.set_value(pos); + + sender.send(DrawMessage::Recalc).unwrap(); + sender.send(DrawMessage::Flush).unwrap(); + image.redraw(); + }); + + let mut tag_position = self.tag_position.clone(); + let mut image = self.page.image.clone(); + 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 height = prop.original_dimension.1; + let pos = height / 2.0; + prop.tag_position = pos; + prop.is_saved = false; + tag_position.set_value(pos); + + sender.send(DrawMessage::Recalc).unwrap(); + sender.send(DrawMessage::Flush).unwrap(); + image.redraw(); + }); + + let sender = self.sender.clone(); + let properties = Arc::clone(&self.properties); + self.save_btn.set_callback(move |_| { + let mut prop = properties.write().unwrap(); + prop.is_saved = true; + sender.send(DrawMessage::Save).unwrap() + }); let properties = Arc::clone(&self.properties); let mut crop_win = CropWindow::new(); diff --git a/src/utils.rs b/src/utils.rs index f158eae..3e1ed30 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -139,54 +139,6 @@ impl ImageContainer { prop.original_dimension.1, ); - // let layer = - // DynamicImage::ImageRgba8(ImageBuffer::from_fn(width as u32, height as u32, |_, _| { - // image::Rgba(prop.rgba) - // })); - // image::imageops::overlay(&mut tmp, &layer, 0, 0); - - // let size = quote_from_height(height); - // for (index, line) in prop.quote.lines().enumerate() { - // let (text_width, text_height) = measure_line( - // &globals::FONT_QUOTE, - // line, - // rusttype::Scale::uniform(size as f32), - // ); - - // imageproc::drawing::draw_text_mut( - // &mut tmp, - // image::Rgba([255, 255, 255, 255]), - // ((width - text_width) / 2.0) as u32, - // ((prop.quote_position * height) / prop.original_dimension.1 - // + (text_height / 2.0) - // + index as f64 * (text_height * 1.2)) as u32, - // rusttype::Scale::uniform(size as f32), - // &globals::FONT_QUOTE, - // line, - // ); - // } - - // let size = tag_from_height(height); - // for (index, line) in prop.tag.lines().enumerate() { - // let (text_width, text_height) = measure_line( - // &globals::FONT_TAG, - // line, - // rusttype::Scale::uniform(size as f32), - // ); - - // imageproc::drawing::draw_text_mut( - // &mut tmp, - // image::Rgba([255, 255, 255, 255]), - // (width * 0.99 - text_width) as u32, - // ((prop.tag_position * height) / prop.original_dimension.1 - // + (text_height / 2.0) - // + index as f64 * (text_height * 1.2)) as u32, - // rusttype::Scale::uniform(size as f32), - // &globals::FONT_TAG, - // line, - // ); - // } - self.buffer = tmp; } @@ -226,56 +178,6 @@ impl ImageContainer { prop.tag_position, prop.original_dimension.1, ); - - // let layer = DynamicImage::ImageRgba8(ImageBuffer::from_fn( - // crop_width as u32, - // crop_height as u32, - // |_, _| image::Rgba(prop.rgba), - // )); - // image::imageops::overlay(&mut img, &layer, 0, 0); - - // let size = quote_from_height(crop_height); - // for (index, line) in prop.quote.lines().enumerate() { - // let (text_width, text_height) = measure_line( - // &globals::FONT_QUOTE, - // line, - // rusttype::Scale::uniform(size as f32), - // ); - - // imageproc::drawing::draw_text_mut( - // &mut img, - // image::Rgba([255, 255, 255, 255]), - // ((crop_width - text_width) / 2.0) as u32, - // ((prop.quote_position * crop_height) / prop.original_dimension.1 - // + (text_height / 2.0) - // + index as f64 * (text_height * 1.2)) as u32, - // rusttype::Scale::uniform(size as f32), - // &globals::FONT_QUOTE, - // line, - // ); - // } - - // let size = tag_from_height(crop_height); - // for (index, line) in prop.tag.lines().enumerate() { - // let (text_width, text_height) = measure_line( - // &globals::FONT_TAG, - // line, - // rusttype::Scale::uniform(size as f32), - // ); - - // imageproc::drawing::draw_text_mut( - // &mut img, - // image::Rgba([255, 255, 255, 255]), - // (crop_width * 0.99 - text_width) as u32, - // ((prop.tag_position * crop_height) / prop.original_dimension.1 - // + (text_height / 2.0) - // + index as f64 * (text_height * 1.2)) as u32, - // rusttype::Scale::uniform(size as f32), - // &globals::FONT_TAG, - // line, - // ); - // } - image::save_buffer( export, img.as_rgb8().unwrap().as_raw(),