From fd6619f2f7e98f1f29a3d5e9337f7e63905e617a Mon Sep 17 00:00:00 2001 From: Piyush Mishra Date: Fri, 14 Jan 2022 14:39:43 +0530 Subject: [PATCH] added: 1) file list reset button 2) sliders for position --- src/config.rs | 6 +-- src/draw_thread.rs | 17 +++++++ src/main_window.rs | 119 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 114 insertions(+), 28 deletions(-) diff --git a/src/config.rs b/src/config.rs index a14f0f3..657980c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -71,9 +71,9 @@ impl Default for ConfigFile { Self { quote_font_ttf: String::new(), tag_font_ttf: String::new(), - quote_font_ratio: 259.0, - tag_font_ratio: 96.0, - color_layer: [25, 29, 34, 190], + quote_font_ratio: 215.0, + tag_font_ratio: 150.0, + color_layer: [20, 22, 25, 192], } } } diff --git a/src/draw_thread.rs b/src/draw_thread.rs index d6add8f..f6d7c39 100644 --- a/src/draw_thread.rs +++ b/src/draw_thread.rs @@ -11,6 +11,7 @@ use fltk::{ menu, misc::Spinner, prelude::*, + valuator::Slider, }; use std::{ @@ -47,6 +48,8 @@ pub(crate) fn spawn_image_thread( let mut layer_alpha = main_win.layer_alpha.clone(); let mut quote_position = main_win.quote_position.clone(); let mut tag_position = main_win.tag_position.clone(); + let mut quote_position_slider = main_win.quote_position_slider.clone(); + let mut tag_position_slider = main_win.tag_position_slider.clone(); let mut page = main_win.page.clone(); let mut status = main_win.status.clone(); let images_path = Arc::clone(&main_win.images_path); @@ -69,6 +72,8 @@ pub(crate) fn spawn_image_thread( &mut layer_alpha, &mut quote_position, &mut tag_position, + &mut quote_position_slider, + &mut tag_position_slider, &mut page, &app_sender, &properties, @@ -93,6 +98,8 @@ pub(crate) fn spawn_image_thread( &mut layer_alpha, &mut quote_position, &mut tag_position, + &mut quote_position_slider, + &mut tag_position_slider, &mut page, &app_sender, &properties, @@ -135,6 +142,8 @@ fn load_image( layer_alpha: &mut Spinner, quote_position: &mut Spinner, tag_position: &mut Spinner, + quote_position_slider: &mut Slider, + tag_position_slider: &mut Slider, page: &mut Page, app_sender: &app::Sender, properties: &Arc>, @@ -167,6 +176,10 @@ fn load_image( quote_position.set_value(saved_prop.quote_position); tag_position.set_range(0.0, prop.original_dimension.1); tag_position.set_value(saved_prop.tag_position); + quote_position_slider.set_range(0.0, prop.original_dimension.1); + quote_position_slider.set_value(saved_prop.quote_position); + tag_position_slider.set_range(0.0, prop.original_dimension.1); + tag_position_slider.set_value(saved_prop.tag_position); prop.quote = saved_prop.quote; prop.tag = saved_prop.tag; @@ -197,6 +210,10 @@ fn load_image( quote_position.set_value(prop.quote_position); tag_position.set_range(0.0, prop.original_dimension.1); tag_position.set_value(prop.tag_position); + quote_position_slider.set_range(0.0, prop.original_dimension.1); + quote_position_slider.set_value(prop.quote_position); + tag_position_slider.set_range(0.0, prop.original_dimension.1); + tag_position_slider.set_value(prop.tag_position); let glob = &globals::CONFIG.read().unwrap(); layer_red.set_value(glob.color_layer[0] as f64); diff --git a/src/main_window.rs b/src/main_window.rs index 73e7108..e459f3c 100644 --- a/src/main_window.rs +++ b/src/main_window.rs @@ -2,6 +2,7 @@ use crate::crop_window::CropWindow; use crate::draw_thread::*; use crate::utils::ImageProperties; use crate::{config_window::ConfigWindow, globals}; +use fltk::valuator::{Slider, SliderType}; use fltk::{ app, button::Button, @@ -36,9 +37,12 @@ pub(crate) struct MainWindow { pub(crate) layer_alpha: Spinner, pub(crate) quote_position: Spinner, pub(crate) tag_position: Spinner, + pub(crate) quote_position_slider: Slider, + pub(crate) tag_position_slider: Slider, pub(crate) reset_darklayer_btn: Button, pub(crate) reset_quote_position_btn: Button, pub(crate) reset_tag_position_btn: Button, + pub(crate) reset_file_choice: Button, pub(crate) crop_btn: Button, pub(crate) status: Frame, pub(crate) page: Page, @@ -77,6 +81,8 @@ impl MainWindow { let save_btn = Button::default().with_label("Save"); toolbar_flex.set_size(&save_btn, 50); let file_choice = menu::Choice::default(); + let reset_file_choice = Button::default().with_label("@returnarrow"); + toolbar_flex.set_size(&reset_file_choice, 30); toolbar_flex.end(); main_flex.set_size(&toolbar_flex, 30); @@ -140,6 +146,10 @@ impl MainWindow { quote_position_flex.end(); controls_flex.set_size("e_position_flex, 30); + let mut quote_position_slider = Slider::default().with_type(SliderType::HorizontalNice); + quote_position_slider.set_step(1.0, 1); + controls_flex.set_size("e_position_slider, 30); + let mut tag_position_flex = Flex::default().row(); Frame::default() .with_label("Tag Position:") @@ -150,6 +160,10 @@ impl MainWindow { tag_position_flex.end(); controls_flex.set_size(&tag_position_flex, 30); + let mut tag_position_slider = Slider::default().with_type(SliderType::HorizontalNice); + tag_position_slider.set_step(1.0, 1); + controls_flex.set_size(&tag_position_slider, 30); + let mut actions_flex = Flex::default().row(); Frame::default(); let crop_btn = Button::default().with_label("Crop"); @@ -203,9 +217,12 @@ impl MainWindow { layer_alpha, quote_position, tag_position, + quote_position_slider, + tag_position_slider, reset_darklayer_btn, reset_quote_position_btn, reset_tag_position_btn, + reset_file_choice, crop_btn, status, images_path: Arc::new(RwLock::new(vec![])), @@ -228,20 +245,17 @@ impl MainWindow { fn menu(&mut self) { let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); - let mut win = self.win.clone(); let imgs = Arc::clone(&self.images_path); self.menubar.add( "&File/Open Folder...\t", Shortcut::Ctrl | 'o', menu::MenuFlag::Normal, move |_| { - win.redraw(); let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseDir); chooser.set_option(fltk::dialog::FileDialogOptions::NewFolder); chooser.show(); let path = chooser.filename(); if !path.exists() { - win.activate(); return; } let expost_dir = path.join("export"); @@ -251,28 +265,7 @@ impl MainWindow { return; } } - let files = fs::read_dir(&path).unwrap(); - let mut text = String::new(); - let mut imgs_b = imgs.write().unwrap(); - *imgs_b = vec![]; - for file in files { - let file = file.unwrap(); - let path = file.path(); - if path.extension() == Some(OsStr::new("jpg")) - || path.extension() == Some(OsStr::new("png")) - { - text = format!("{}|{}", text, path.file_name().unwrap().to_str().unwrap()); - imgs_b.push(path); - } - } - if text.len() == 0 { - win.activate(); - return; - } - file_choice.clear(); - file_choice.add_choice(&text[1..]); - file_choice.set_value(0); - sender.send(DrawMessage::Open).unwrap(); + load_dir(&path, Arc::clone(&imgs), &mut file_choice, &sender); }, ); @@ -325,6 +318,17 @@ impl MainWindow { } fn events(&mut self) { + let mut file_choice = self.file_choice.clone(); + let sender = self.sender.clone(); + let imgs = Arc::clone(&self.images_path); + self.reset_file_choice.set_callback(move |_| { + let path = match imgs.read().unwrap().first() { + Some(path) => path.parent().unwrap().to_path_buf(), + None => return, + }; + load_dir(&path, Arc::clone(&imgs), &mut file_choice, &sender); + }); + let mut layer_red = self.layer_red.clone(); let mut layer_green = self.layer_green.clone(); let mut layer_blue = self.layer_blue.clone(); @@ -347,6 +351,7 @@ impl MainWindow { }); let mut quote_position = self.quote_position.clone(); + let mut quote_position_slider = self.quote_position_slider.clone(); let mut image = self.page.image.clone(); let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); @@ -357,6 +362,7 @@ impl MainWindow { prop.quote_position = pos; prop.is_saved = false; quote_position.set_value(pos); + quote_position_slider.set_value(pos); sender.send(DrawMessage::Recalc).unwrap(); sender.send(DrawMessage::Flush).unwrap(); @@ -364,6 +370,7 @@ impl MainWindow { }); let mut tag_position = self.tag_position.clone(); + let mut tag_position_slider = self.tag_position_slider.clone(); let mut image = self.page.image.clone(); let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); @@ -374,6 +381,7 @@ impl MainWindow { prop.tag_position = pos; prop.is_saved = false; tag_position.set_value(pos); + tag_position_slider.set_value(pos); sender.send(DrawMessage::Recalc).unwrap(); sender.send(DrawMessage::Flush).unwrap(); @@ -493,9 +501,11 @@ impl MainWindow { let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); 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(); prop.quote_position = f.value(); + quote_position_slider.set_value(f.value()); prop.is_saved = false; sender.send(DrawMessage::Recalc).unwrap(); sender.send(DrawMessage::Flush).unwrap(); @@ -505,9 +515,39 @@ impl MainWindow { let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); 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(); + prop.quote_position = f.value(); + quote_position.set_value(f.value()); + prop.is_saved = false; + sender.send(DrawMessage::Recalc).unwrap(); + sender.send(DrawMessage::Flush).unwrap(); + image.redraw(); + }); + + let mut image = self.page.image.clone(); + let properties = Arc::clone(&self.properties); + 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(); prop.tag_position = f.value(); + tag_position_slider.set_value(f.value()); + prop.is_saved = false; + sender.send(DrawMessage::Recalc).unwrap(); + sender.send(DrawMessage::Flush).unwrap(); + image.redraw(); + }); + + let mut image = self.page.image.clone(); + let properties = Arc::clone(&self.properties); + 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(); + prop.tag_position = f.value(); + tag_position.set_value(f.value()); prop.is_saved = false; sender.send(DrawMessage::Recalc).unwrap(); sender.send(DrawMessage::Flush).unwrap(); @@ -563,3 +603,32 @@ impl MainWindow { }); } } + +fn load_dir( + path: &PathBuf, + imgs: Arc>>, + file_choice: &mut menu::Choice, + sender: &mpsc::Sender, +) { + let files = fs::read_dir(path).unwrap(); + let mut text = String::new(); + let mut imgs_b = imgs.write().unwrap(); + *imgs_b = vec![]; + for file in files { + let file = file.unwrap(); + let path = file.path(); + if path.extension() == Some(OsStr::new("jpg")) + || path.extension() == Some(OsStr::new("png")) + { + text = format!("{}|{}", text, path.file_name().unwrap().to_str().unwrap()); + imgs_b.push(path); + } + } + if text.len() == 0 { + return; + } + file_choice.clear(); + file_choice.add_choice(&text[1..]); + file_choice.set_value(0); + sender.send(DrawMessage::Open).unwrap(); +}