From 9efe1374e93b2f244d7ab3fc262221b687f71964 Mon Sep 17 00:00:00 2001 From: Piyush Mishra Date: Wed, 26 Jan 2022 13:42:40 +0530 Subject: [PATCH] Cleaning and Version upgrade to 0.2.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/config.rs | 85 ++++++----- src/config_picker.rs | 8 +- src/config_window.rs | 330 +++++++++++++++++++++++-------------------- src/crop_window.rs | 7 +- src/draw_thread.rs | 18 +-- src/globals.rs | 31 +++- src/main.rs | 6 +- src/main_window.rs | 107 +++++++++----- src/utils.rs | 163 +++++++++++---------- 11 files changed, 435 insertions(+), 324 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 99e45b9..2ad9555 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -602,7 +602,7 @@ dependencies = [ [[package]] name = "post_maker" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "dirs", diff --git a/Cargo.toml b/Cargo.toml index e7d59fd..45b2839 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "post_maker" -version = "0.1.0" +version = "0.2.0" edition = "2021" description = "Post Maker helps you to make post for instagram and other social madia apps easily" authors = ["Piyush Raj "] diff --git a/src/config.rs b/src/config.rs index 8d356a9..0c1f83e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,7 +12,7 @@ along with Post Maker. If not, see */ -///! load, save configuration and parse cli args +//! load, save configuration and parse cli args use crate::{config_picker::ConfigPicker, globals}; use clap::{ArgEnum, Parser}; use fltk::dialog; @@ -27,6 +27,7 @@ use std::{ }; lazy_static! { + /// Directory where all Configurations are present static ref CONFIG_DIR: PathBuf = { let dir = match dirs::config_dir() { Some(path) => path, @@ -45,8 +46,12 @@ lazy_static! { } dir }; + + /// Configuration File static ref CONFIG_FILE: PathBuf = CONFIG_DIR.join("post_maker.config"); - static ref LOG_PATH: PathBuf = CONFIG_DIR.join("post_maker.log"); + + /// Log File + static ref LOG_FILE: PathBuf = CONFIG_DIR.join("post_maker.log"); } /// Simple program calculate size of stuff in quote image @@ -103,14 +108,19 @@ impl Into for Themes { } } +pub(crate) fn args() -> Args { + let args = Args::parse(); + args +} + /// Configuation file #[derive(Debug, Clone, Serialize, Deserialize)] pub(crate) struct ConfigFile { - pub(crate) quote_font_ttf: String, - pub(crate) subquote_font_ttf: String, - pub(crate) subquote2_font_ttf: String, - pub(crate) tag_font_ttf: String, - pub(crate) tag2_font_ttf: String, + pub(crate) quote_font: String, + pub(crate) subquote_font: String, + pub(crate) subquote2_font: String, + pub(crate) tag_font: String, + pub(crate) tag2_font: String, pub(crate) quote_font_ratio: f64, pub(crate) subquote_font_ratio: f64, pub(crate) subquote2_font_ratio: f64, @@ -128,11 +138,11 @@ pub(crate) struct ConfigFile { impl Default for ConfigFile { fn default() -> Self { Self { - quote_font_ttf: String::new(), - subquote_font_ttf: String::new(), - subquote2_font_ttf: String::new(), - tag_font_ttf: String::new(), - tag2_font_ttf: String::new(), + quote_font: String::new(), + subquote_font: String::new(), + subquote2_font: String::new(), + tag_font: String::new(), + tag2_font: String::new(), quote_font_ratio: 230.0, subquote_font_ratio: 230.0, subquote2_font_ratio: 230.0, @@ -190,6 +200,7 @@ impl ConfigFile { } } +/// Get parsed configs from file pub(crate) fn get_configs() -> Option> { match std::fs::read_to_string(&*CONFIG_FILE) { Ok(r) => serde_json::from_str::>(&r).ok(), @@ -197,6 +208,7 @@ pub(crate) fn get_configs() -> Option> { } } +/// Save configs pub(crate) fn save_configs(configs: HashMap) { if let Err(e) = std::fs::write(&*CONFIG_FILE, serde_json::to_string(&configs).unwrap()) { dialog::alert_default("Can't write config!"); @@ -205,9 +217,28 @@ pub(crate) fn save_configs(configs: HashMap) { } } -pub(crate) fn config() -> Args { - let args = Args::parse(); - args +pub(crate) fn log_file() -> File { + match File::open(&*LOG_FILE) { + Ok(mut file) => { + if is_file_30_days_old(&file) { + match File::create(&*LOG_FILE) { + Ok(f) => file = f, + Err(e) => { + dialog::alert_default("Can't open log file!"); + panic!("{:?}", e); + } + } + } + file + } + Err(_) => match File::create(&*LOG_FILE) { + Ok(f) => f, + Err(e) => { + dialog::alert_default("Can't open log file!"); + panic!("{:?}", e); + } + }, + } } pub(crate) fn is_file_30_days_old(file: &File) -> bool { @@ -222,27 +253,3 @@ pub(crate) fn is_file_30_days_old(file: &File) -> bool { } false } - -pub(crate) fn log_file() -> File { - match File::open(&*LOG_PATH) { - Ok(mut file) => { - if is_file_30_days_old(&file) { - match File::create(&*LOG_PATH) { - Ok(f) => file = f, - Err(e) => { - dialog::alert_default("Can't open log file!"); - panic!("{:?}", e); - } - } - } - file - } - Err(_) => match File::create(&*LOG_PATH) { - Ok(f) => f, - Err(e) => { - dialog::alert_default("Can't open log file!"); - panic!("{:?}", e); - } - }, - } -} diff --git a/src/config_picker.rs b/src/config_picker.rs index 3c99b5f..004acca 100644 --- a/src/config_picker.rs +++ b/src/config_picker.rs @@ -12,8 +12,7 @@ along with Post Maker. If not, see */ -use std::{cell::RefCell, rc::Rc}; - +//! Picker to pick config if multiple configs are present or defalut config is not present use crate::globals; use fltk::{ app, @@ -25,6 +24,7 @@ use fltk::{ prelude::*, window::Window, }; +use std::{cell::RefCell, rc::Rc}; pub(crate) struct ConfigPicker { pub(crate) win: Window, @@ -87,17 +87,21 @@ impl ConfigPicker { config_picker } + // Set callbacks of elements fn event(&mut self) { + // Apply Button let mut win = self.win.clone(); self.apply_btn.set_callback(move |_| { win.hide(); }); + // Browse List let selected = Rc::clone(&self.selected); self.browse.set_callback(move |f| { *selected.borrow_mut() = f.selected_text(); }); + // Window Close let selected = Rc::clone(&self.selected); self.win.set_callback(move |f| { *selected.borrow_mut() = None; diff --git a/src/config_window.rs b/src/config_window.rs index 2803519..d503cae 100644 --- a/src/config_window.rs +++ b/src/config_window.rs @@ -42,16 +42,16 @@ pub(crate) struct ConfigWindow { pub(crate) selected_browse_line: Rc>, pub(crate) add_config_btn: Button, pub(crate) del_config_btn: Button, - pub(crate) quote_font_ttf: Output, - pub(crate) quote_font_ttf_browse: Button, - pub(crate) subquote_font_ttf: Output, - pub(crate) subquote_font_ttf_browse: Button, - pub(crate) subquote2_font_ttf: Output, - pub(crate) subquote2_font_ttf_browse: Button, - pub(crate) tag_font_ttf: Output, - pub(crate) tag_font_ttf_browse: Button, - pub(crate) tag2_font_ttf: Output, - pub(crate) tag2_font_ttf_browse: Button, + pub(crate) quote_font: Output, + pub(crate) quote_font_browse: Button, + pub(crate) subquote_font: Output, + pub(crate) subquote_font_browse: Button, + pub(crate) subquote2_font: Output, + pub(crate) subquote2_font_browse: Button, + pub(crate) tag_font: Output, + pub(crate) tag_font_browse: Button, + pub(crate) tag2_font: Output, + pub(crate) tag2_font_browse: Button, pub(crate) quote_font_ratio: ValueInput, pub(crate) subquote_font_ratio: ValueInput, pub(crate) subquote2_font_ratio: ValueInput, @@ -64,8 +64,10 @@ pub(crate) struct ConfigWindow { pub(crate) tag2_position_ratio: ValueInput, pub(crate) image_ratio_width: ValueInput, pub(crate) image_ratio_height: ValueInput, - pub(crate) layer_rgb: Button, - pub(crate) layer_alpha: ValueInput, + /// RGB value of top translucent layer + pub(crate) translucent_layer_rgb: Button, + /// opacity value of top translucent layer + pub(crate) translucent_layer_alpha: ValueInput, pub(crate) defaults_btn: Button, pub(crate) save_btn: Button, pub(crate) cancel_btn: Button, @@ -112,73 +114,73 @@ impl ConfigWindow { let row_grp = Flex::default().row(); // column 1 let mut col_grp = Flex::default().column(); - let mut quote_font_ttf_grp = Flex::default().row(); - quote_font_ttf_grp.set_size( + let mut quote_font_grp = Flex::default().row(); + quote_font_grp.set_size( &Frame::default() .with_label("Quote") .with_align(Align::Right | Align::Inside), 130, ); - let quote_font_ttf = Output::default(); - let quote_font_ttf_browse = Button::default().with_label("Pick"); - quote_font_ttf_grp.set_size("e_font_ttf_browse, 50); - quote_font_ttf_grp.end(); - col_grp.set_size("e_font_ttf_grp, 30); + let quote_font = Output::default(); + let quote_font_browse = Button::default().with_label("Pick"); + quote_font_grp.set_size("e_font_browse, 50); + quote_font_grp.end(); + col_grp.set_size("e_font_grp, 30); - let mut subquote_font_ttf_grp = Flex::default().row(); - subquote_font_ttf_grp.set_size( + let mut subquote_font_grp = Flex::default().row(); + subquote_font_grp.set_size( &Frame::default() .with_label("Subquote") .with_align(Align::Right | Align::Inside), 130, ); - let subquote_font_ttf = Output::default(); - let subquote_font_ttf_browse = Button::default().with_label("Pick"); - subquote_font_ttf_grp.set_size(&subquote_font_ttf_browse, 50); - subquote_font_ttf_grp.end(); - col_grp.set_size(&subquote_font_ttf_grp, 30); + let subquote_font = Output::default(); + let subquote_font_browse = Button::default().with_label("Pick"); + subquote_font_grp.set_size(&subquote_font_browse, 50); + subquote_font_grp.end(); + col_grp.set_size(&subquote_font_grp, 30); - let mut subquote2_font_ttf_grp = Flex::default().row(); - subquote2_font_ttf_grp.set_size( + let mut subquote2_font_grp = Flex::default().row(); + subquote2_font_grp.set_size( &Frame::default() .with_label("Subquote 2") .with_align(Align::Right | Align::Inside), 130, ); - let subquote2_font_ttf = Output::default(); - let subquote2_font_ttf_browse = Button::default().with_label("Pick"); - subquote2_font_ttf_grp.set_size(&subquote2_font_ttf_browse, 50); - subquote2_font_ttf_grp.end(); - col_grp.set_size(&subquote2_font_ttf_grp, 30); + let subquote2_font = Output::default(); + let subquote2_font_browse = Button::default().with_label("Pick"); + subquote2_font_grp.set_size(&subquote2_font_browse, 50); + subquote2_font_grp.end(); + col_grp.set_size(&subquote2_font_grp, 30); col_grp.end(); // column 2 let mut col_grp = Flex::default().column(); - let mut tag_font_ttf_grp = Flex::default().row(); - tag_font_ttf_grp.set_size( + let mut tag_font_grp = Flex::default().row(); + tag_font_grp.set_size( &Frame::default() .with_label("Tag") .with_align(Align::Right | Align::Inside), 130, ); - let tag_font_ttf = Output::default(); - let tag_font_ttf_browse = Button::default().with_label("Pick"); - tag_font_ttf_grp.set_size(&tag_font_ttf_browse, 50); - tag_font_ttf_grp.end(); - col_grp.set_size(&tag_font_ttf_grp, 30); + let tag_font = Output::default(); + let tag_font_browse = Button::default().with_label("Pick"); + tag_font_grp.set_size(&tag_font_browse, 50); + tag_font_grp.end(); + col_grp.set_size(&tag_font_grp, 30); - let mut tag2_font_ttf_grp = Flex::default().row(); - tag2_font_ttf_grp.set_size( + let mut tag2_font_grp = Flex::default().row(); + tag2_font_grp.set_size( &Frame::default() .with_label("Tag 2") .with_align(Align::Right | Align::Inside), 130, ); - let tag2_font_ttf = Output::default(); - let tag2_font_ttf_browse = Button::default().with_label("Pick"); - tag2_font_ttf_grp.set_size(&tag2_font_ttf_browse, 50); - tag2_font_ttf_grp.end(); - col_grp.set_size(&tag2_font_ttf_grp, 30); + let tag2_font = Output::default(); + let tag2_font_browse = Button::default().with_label("Pick"); + tag2_font_grp.set_size(&tag2_font_browse, 50); + tag2_font_grp.end(); + col_grp.set_size(&tag2_font_grp, 30); col_grp.end(); row_grp.end(); col.set_size(&row_grp, 110); @@ -355,16 +357,16 @@ impl ConfigWindow { hint.set_label_size(12); col.set_size(&hint, 20); - let mut darklayer_flex = Flex::default().row(); - darklayer_flex.set_pad(2); - darklayer_flex.set_size(&Frame::default().with_label("Colour"), 50); - let mut layer_rgb = Button::default(); - layer_rgb.set_frame(enums::FrameType::BorderBox); + let mut translucent_layer_flex = Flex::default().row(); + translucent_layer_flex.set_pad(2); + translucent_layer_flex.set_size(&Frame::default().with_label("Colour"), 50); + let mut translucent_layer_rgb = Button::default(); + translucent_layer_rgb.set_frame(enums::FrameType::BorderBox); - darklayer_flex.set_size(&Frame::default().with_label("Alpha"), 50); - let layer_alpha = ValueInput::default(); - darklayer_flex.end(); - col.set_size(&darklayer_flex, 30); + translucent_layer_flex.set_size(&Frame::default().with_label("Alpha"), 50); + let translucent_layer_alpha = ValueInput::default(); + translucent_layer_flex.end(); + col.set_size(&translucent_layer_flex, 30); Frame::default(); @@ -392,16 +394,16 @@ impl ConfigWindow { selected_browse_line: Rc::new(RefCell::new(0)), add_config_btn, del_config_btn, - quote_font_ttf, - quote_font_ttf_browse, - subquote_font_ttf, - subquote_font_ttf_browse, - subquote2_font_ttf, - subquote2_font_ttf_browse, - tag_font_ttf, - tag_font_ttf_browse, - tag2_font_ttf, - tag2_font_ttf_browse, + quote_font, + quote_font_browse, + subquote_font, + subquote_font_browse, + subquote2_font, + subquote2_font_browse, + tag_font, + tag_font_browse, + tag2_font, + tag2_font_browse, quote_font_ratio, subquote_font_ratio, subquote2_font_ratio, @@ -414,8 +416,8 @@ impl ConfigWindow { tag2_position_ratio, image_ratio_width, image_ratio_height, - layer_rgb, - layer_alpha, + translucent_layer_rgb, + translucent_layer_alpha, defaults_btn, save_btn, cancel_btn, @@ -427,6 +429,7 @@ impl ConfigWindow { config_window } + // Show to edit config pub(crate) fn show(&mut self) -> bool { let config_name = &*globals::CONFIG_NAME.read().unwrap(); self.browse.clear(); @@ -438,14 +441,12 @@ impl ConfigWindow { } *self.selected_browse_line.borrow_mut() = self.browse.value(); let config = globals::CONFIG.read().unwrap(); - self.quote_font_ttf - .set_value(config.quote_font_ttf.as_str()); - self.subquote_font_ttf - .set_value(config.subquote_font_ttf.as_str()); - self.subquote2_font_ttf - .set_value(config.subquote2_font_ttf.as_str()); - self.tag_font_ttf.set_value(config.tag_font_ttf.as_str()); - self.tag2_font_ttf.set_value(config.tag2_font_ttf.as_str()); + self.quote_font.set_value(config.quote_font.as_str()); + self.subquote_font.set_value(config.subquote_font.as_str()); + self.subquote2_font + .set_value(config.subquote2_font.as_str()); + self.tag_font.set_value(config.tag_font.as_str()); + self.tag2_font.set_value(config.tag2_font.as_str()); self.quote_font_ratio.set_value(config.quote_font_ratio); self.subquote_font_ratio .set_value(config.subquote_font_ratio); @@ -464,8 +465,9 @@ impl ConfigWindow { .set_value(config.tag2_position_ratio); self.image_ratio_width.set_value(config.image_ratio.0); self.image_ratio_height.set_value(config.image_ratio.1); - utils::set_color_btn_rgba(config.color_layer, &mut self.layer_rgb); - self.layer_alpha.set_value(config.color_layer[3] as f64); + utils::set_color_btn_rgba(config.color_layer, &mut self.translucent_layer_rgb); + self.translucent_layer_alpha + .set_value(config.color_layer[3] as f64); *self.did_save.borrow_mut() = false; drop(config); self.win.show(); @@ -475,12 +477,14 @@ impl ConfigWindow { *self.did_save.borrow() } + /// Set callbacks of elements fn event(&mut self) { - let mut quote_font_ttf = self.quote_font_ttf.clone(); - let mut subquote_font_ttf = self.subquote_font_ttf.clone(); - let mut subquote2_font_ttf = self.subquote2_font_ttf.clone(); - let mut tag_font_ttf = self.tag_font_ttf.clone(); - let mut tag2_font_ttf = self.tag2_font_ttf.clone(); + // Add new Config Button + let mut quote_font = self.quote_font.clone(); + let mut subquote_font = self.subquote_font.clone(); + let mut subquote2_font = self.subquote2_font.clone(); + let mut tag_font = self.tag_font.clone(); + let mut tag2_font = self.tag2_font.clone(); let mut quote_font_ratio = self.quote_font_ratio.clone(); let mut subquote_font_ratio = self.subquote_font_ratio.clone(); let mut subquote2_font_ratio = self.subquote2_font_ratio.clone(); @@ -493,8 +497,8 @@ impl ConfigWindow { let mut tag2_position_ratio = self.tag2_position_ratio.clone(); let mut image_ratio_width = self.image_ratio_width.clone(); let mut image_ratio_height = self.image_ratio_height.clone(); - let mut layer_rgb = self.layer_rgb.clone(); - let mut layer_alpha = self.layer_alpha.clone(); + let mut layer_rgb = self.translucent_layer_rgb.clone(); + let mut layer_alpha = self.translucent_layer_alpha.clone(); let mut browse = self.browse.clone(); let configs = Rc::clone(&self.configs); let selected_browse_line = Rc::clone(&self.selected_browse_line); @@ -519,11 +523,11 @@ impl ConfigWindow { }; let conf = ConfigFile::default(); - quote_font_ttf.set_value(&conf.quote_font_ttf); - subquote_font_ttf.set_value(&conf.subquote_font_ttf); - subquote2_font_ttf.set_value(&conf.subquote2_font_ttf); - tag_font_ttf.set_value(&conf.tag_font_ttf); - tag2_font_ttf.set_value(&conf.tag2_font_ttf); + quote_font.set_value(&conf.quote_font); + subquote_font.set_value(&conf.subquote_font); + subquote2_font.set_value(&conf.subquote2_font); + tag_font.set_value(&conf.tag_font); + tag2_font.set_value(&conf.tag2_font); quote_font_ratio.set_value(conf.quote_font_ratio); subquote_font_ratio.set_value(conf.subquote_font_ratio); subquote2_font_ratio.set_value(conf.subquote2_font_ratio); @@ -545,11 +549,12 @@ impl ConfigWindow { layer_rgb.redraw(); }); - let mut quote_font_ttf = self.quote_font_ttf.clone(); - let mut subquote_font_ttf = self.subquote_font_ttf.clone(); - let mut subquote2_font_ttf = self.subquote2_font_ttf.clone(); - let mut tag_font_ttf = self.tag_font_ttf.clone(); - let mut tag2_font_ttf = self.tag2_font_ttf.clone(); + // Delete selected Config Button + let mut quote_font = self.quote_font.clone(); + let mut subquote_font = self.subquote_font.clone(); + let mut subquote2_font = self.subquote2_font.clone(); + let mut tag_font = self.tag_font.clone(); + let mut tag2_font = self.tag2_font.clone(); let mut quote_font_ratio = self.quote_font_ratio.clone(); let mut subquote_font_ratio = self.subquote_font_ratio.clone(); let mut subquote2_font_ratio = self.subquote2_font_ratio.clone(); @@ -562,8 +567,8 @@ impl ConfigWindow { let mut tag2_position_ratio = self.tag2_position_ratio.clone(); let mut image_ratio_width = self.image_ratio_width.clone(); let mut image_ratio_height = self.image_ratio_height.clone(); - let mut layer_rgb = self.layer_rgb.clone(); - let mut layer_alpha = self.layer_alpha.clone(); + let mut layer_rgb = self.translucent_layer_rgb.clone(); + let mut layer_alpha = self.translucent_layer_alpha.clone(); let mut browse = self.browse.clone(); let configs = Rc::clone(&self.configs); let selected_browse_line = Rc::clone(&self.selected_browse_line); @@ -587,11 +592,11 @@ impl ConfigWindow { *selected_browse_line.borrow_mut() = browse.value(); if let Some(conf) = configs.borrow().get(&browse.selected_text().unwrap()) { - quote_font_ttf.set_value(&conf.quote_font_ttf); - subquote_font_ttf.set_value(&conf.subquote_font_ttf); - subquote2_font_ttf.set_value(&conf.subquote2_font_ttf); - tag_font_ttf.set_value(&conf.tag_font_ttf); - tag2_font_ttf.set_value(&conf.tag2_font_ttf); + quote_font.set_value(&conf.quote_font); + subquote_font.set_value(&conf.subquote_font); + subquote2_font.set_value(&conf.subquote2_font); + tag_font.set_value(&conf.tag_font); + tag2_font.set_value(&conf.tag2_font); quote_font_ratio.set_value(conf.quote_font_ratio); subquote_font_ratio.set_value(conf.subquote_font_ratio); subquote2_font_ratio.set_value(conf.subquote2_font_ratio); @@ -610,11 +615,12 @@ impl ConfigWindow { } }); - let mut quote_font_ttf = self.quote_font_ttf.clone(); - let mut subquote_font_ttf = self.subquote_font_ttf.clone(); - let mut subquote2_font_ttf = self.subquote2_font_ttf.clone(); - let mut tag_font_ttf = self.tag_font_ttf.clone(); - let mut tag2_font_ttf = self.tag2_font_ttf.clone(); + // Browse Config List + let mut quote_font = self.quote_font.clone(); + let mut subquote_font = self.subquote_font.clone(); + let mut subquote2_font = self.subquote2_font.clone(); + let mut tag_font = self.tag_font.clone(); + let mut tag2_font = self.tag2_font.clone(); let mut quote_font_ratio = self.quote_font_ratio.clone(); let mut subquote_font_ratio = self.subquote_font_ratio.clone(); let mut subquote2_font_ratio = self.subquote2_font_ratio.clone(); @@ -627,8 +633,8 @@ impl ConfigWindow { let mut tag2_position_ratio = self.tag2_position_ratio.clone(); let mut image_ratio_width = self.image_ratio_width.clone(); let mut image_ratio_height = self.image_ratio_height.clone(); - let mut layer_rgb = self.layer_rgb.clone(); - let mut layer_alpha = self.layer_alpha.clone(); + let mut layer_rgb = self.translucent_layer_rgb.clone(); + let mut layer_alpha = self.translucent_layer_alpha.clone(); let configs = Rc::clone(&self.configs); let selected_browse_line = Rc::clone(&self.selected_browse_line); self.browse.set_callback(move |f| { @@ -642,11 +648,11 @@ impl ConfigWindow { } if let Some(conf) = configs.borrow().get(&f.selected_text().unwrap()) { - quote_font_ttf.set_value(&conf.quote_font_ttf); - subquote_font_ttf.set_value(&conf.subquote_font_ttf); - subquote2_font_ttf.set_value(&conf.subquote2_font_ttf); - tag_font_ttf.set_value(&conf.tag_font_ttf); - tag2_font_ttf.set_value(&conf.tag2_font_ttf); + quote_font.set_value(&conf.quote_font); + subquote_font.set_value(&conf.subquote_font); + subquote2_font.set_value(&conf.subquote2_font); + tag_font.set_value(&conf.tag_font); + tag2_font.set_value(&conf.tag2_font); quote_font_ratio.set_value(conf.quote_font_ratio); subquote_font_ratio.set_value(conf.subquote_font_ratio); subquote2_font_ratio.set_value(conf.subquote2_font_ratio); @@ -666,10 +672,11 @@ impl ConfigWindow { *selected_browse_line.borrow_mut() = f.value(); }); + // Browse for Quote Font let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - let mut quote_font_ttf = self.quote_font_ttf.clone(); - self.quote_font_ttf_browse.set_callback(move |_| { + let mut quote_font = self.quote_font.clone(); + self.quote_font_browse.set_callback(move |_| { let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseFile); chooser.set_option(FileDialogOptions::UseFilterExt); chooser.set_filter("*.ttf"); @@ -677,19 +684,20 @@ impl ConfigWindow { let path = chooser.filename(); let path = std::fs::canonicalize(&path).unwrap_or(path); let path = path.to_str().unwrap(); - quote_font_ttf.set_value(path); + quote_font.set_value(path); if let Some(conf) = configs .borrow_mut() .get_mut(&browse.selected_text().unwrap()) { - conf.quote_font_ttf = path.to_owned(); + conf.quote_font = path.to_owned(); } }); + // Browse for Subquote Font let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - let mut subquote_font_ttf = self.subquote_font_ttf.clone(); - self.subquote_font_ttf_browse.set_callback(move |_| { + let mut subquote_font = self.subquote_font.clone(); + self.subquote_font_browse.set_callback(move |_| { let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseFile); chooser.set_option(FileDialogOptions::UseFilterExt); chooser.set_filter("*.ttf"); @@ -697,19 +705,20 @@ impl ConfigWindow { let path = chooser.filename(); let path = std::fs::canonicalize(&path).unwrap_or(path); let path = path.to_str().unwrap(); - subquote_font_ttf.set_value(path); + subquote_font.set_value(path); if let Some(conf) = configs .borrow_mut() .get_mut(&browse.selected_text().unwrap()) { - conf.subquote_font_ttf = path.to_owned(); + conf.subquote_font = path.to_owned(); } }); + // Browse for Subquote2 Font let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - let mut subquote2_font_ttf = self.subquote2_font_ttf.clone(); - self.subquote2_font_ttf_browse.set_callback(move |_| { + let mut subquote2_font = self.subquote2_font.clone(); + self.subquote2_font_browse.set_callback(move |_| { let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseFile); chooser.set_option(FileDialogOptions::UseFilterExt); chooser.set_filter("*.ttf"); @@ -717,19 +726,20 @@ impl ConfigWindow { let path = chooser.filename(); let path = std::fs::canonicalize(&path).unwrap_or(path); let path = path.to_str().unwrap(); - subquote2_font_ttf.set_value(path); + subquote2_font.set_value(path); if let Some(conf) = configs .borrow_mut() .get_mut(&browse.selected_text().unwrap()) { - conf.subquote2_font_ttf = path.to_owned(); + conf.subquote2_font = path.to_owned(); } }); + // Browse for Tag Font let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - let mut tag_font_ttf = self.tag_font_ttf.clone(); - self.tag_font_ttf_browse.set_callback(move |_| { + let mut tag_font = self.tag_font.clone(); + self.tag_font_browse.set_callback(move |_| { let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseFile); chooser.set_option(FileDialogOptions::UseFilterExt); chooser.set_filter("*.ttf"); @@ -737,19 +747,20 @@ impl ConfigWindow { let path = chooser.filename(); let path = std::fs::canonicalize(&path).unwrap_or(path); let path = path.to_str().unwrap(); - tag_font_ttf.set_value(path); + tag_font.set_value(path); if let Some(conf) = configs .borrow_mut() .get_mut(&browse.selected_text().unwrap()) { - conf.tag_font_ttf = path.to_owned(); + conf.tag_font = path.to_owned(); } }); + // Browse for Tag2 Font let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - let mut tag2_font_ttf = self.tag2_font_ttf.clone(); - self.tag2_font_ttf_browse.set_callback(move |_| { + let mut tag2_font = self.tag2_font.clone(); + self.tag2_font_browse.set_callback(move |_| { let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseFile); chooser.set_option(FileDialogOptions::UseFilterExt); chooser.set_filter("*.ttf"); @@ -757,12 +768,12 @@ impl ConfigWindow { let path = chooser.filename(); let path = std::fs::canonicalize(&path).unwrap_or(path); let path = path.to_str().unwrap(); - tag2_font_ttf.set_value(path); + tag2_font.set_value(path); if let Some(conf) = configs .borrow_mut() .get_mut(&browse.selected_text().unwrap()) { - conf.tag2_font_ttf = path.to_owned(); + conf.tag2_font = path.to_owned(); } }); @@ -771,8 +782,7 @@ impl ConfigWindow { win.hide(); }); - // Font size ratio - + // Quote font size ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.quote_font_ratio.handle(move |f, ev| { @@ -787,6 +797,7 @@ impl ConfigWindow { true }); + // Subquote font size ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.subquote_font_ratio.handle(move |f, ev| { @@ -801,6 +812,7 @@ impl ConfigWindow { true }); + // Subquote2 font size ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.subquote2_font_ratio.handle(move |f, ev| { @@ -815,6 +827,7 @@ impl ConfigWindow { true }); + // Tag font size ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.tag_font_ratio.handle(move |f, ev| { @@ -829,6 +842,7 @@ impl ConfigWindow { true }); + // Tag2 font size ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.tag2_font_ratio.handle(move |f, ev| { @@ -843,8 +857,7 @@ impl ConfigWindow { true }); - // text Position - + // Quote position ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.quote_position_ratio.handle(move |f, ev| { @@ -859,6 +872,7 @@ impl ConfigWindow { true }); + // Subquote position ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.subquote_position_ratio.handle(move |f, ev| { @@ -873,6 +887,7 @@ impl ConfigWindow { true }); + // Subquote2 position ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.subquote2_position_ratio.handle(move |f, ev| { @@ -887,6 +902,7 @@ impl ConfigWindow { true }); + // Tag position ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.tag_position_ratio.handle(move |f, ev| { @@ -901,6 +917,7 @@ impl ConfigWindow { true }); + // Tag2 position ratio let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.tag2_position_ratio.handle(move |f, ev| { @@ -915,7 +932,7 @@ impl ConfigWindow { true }); - // iamge ratio + // Image Ratio Width let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.image_ratio_width.handle(move |f, ev| { @@ -930,6 +947,7 @@ impl ConfigWindow { true }); + // Image Ratio Height let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); self.image_ratio_height.handle(move |f, ev| { @@ -944,11 +962,10 @@ impl ConfigWindow { true }); - // Color - + // Translucent Layer RGB let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - self.layer_rgb.set_callback(move |mut f| { + self.translucent_layer_rgb.set_callback(move |mut f| { if let Some(conf) = configs .borrow_mut() .get_mut(&browse.selected_text().unwrap()) @@ -968,9 +985,10 @@ impl ConfigWindow { } }); + // Translucent Layer Opacity let browse = self.browse.clone(); let configs = Rc::clone(&self.configs); - self.layer_alpha.handle(move |f, ev| { + self.translucent_layer_alpha.handle(move |f, ev| { if ev == Event::KeyUp { if f.value() > 255.0 { f.set_value(255.0); @@ -988,11 +1006,12 @@ impl ConfigWindow { true }); - let mut quote_font_ttf = self.quote_font_ttf.clone(); - let mut subquote_font_ttf = self.subquote_font_ttf.clone(); - let mut subquote2_font_ttf = self.subquote2_font_ttf.clone(); - let mut tag_font_ttf = self.tag_font_ttf.clone(); - let mut tag2_font_ttf = self.tag2_font_ttf.clone(); + // Reset to default configuation button + let mut quote_font = self.quote_font.clone(); + let mut subquote_font = self.subquote_font.clone(); + let mut subquote2_font = self.subquote2_font.clone(); + let mut tag_font = self.tag_font.clone(); + let mut tag2_font = self.tag2_font.clone(); let mut quote_font_ratio = self.quote_font_ratio.clone(); let mut subquote_font_ratio = self.subquote_font_ratio.clone(); let mut subquote2_font_ratio = self.subquote2_font_ratio.clone(); @@ -1005,17 +1024,17 @@ impl ConfigWindow { let mut tag2_position_ratio = self.tag2_position_ratio.clone(); let mut image_ratio_width = self.image_ratio_width.clone(); let mut image_ratio_height = self.image_ratio_height.clone(); - let mut layer_rgb = self.layer_rgb.clone(); - let mut layer_alpha = self.layer_alpha.clone(); + let mut layer_rgb = self.translucent_layer_rgb.clone(); + let mut layer_alpha = self.translucent_layer_alpha.clone(); let configs = Rc::clone(&self.configs); let browse = self.browse.clone(); self.defaults_btn.set_callback(move |_| { let conf = ConfigFile::default(); - quote_font_ttf.set_value(&conf.quote_font_ttf); - subquote_font_ttf.set_value(&conf.subquote_font_ttf); - subquote2_font_ttf.set_value(&conf.subquote2_font_ttf); - tag_font_ttf.set_value(&conf.tag_font_ttf); - tag2_font_ttf.set_value(&conf.tag2_font_ttf); + quote_font.set_value(&conf.quote_font); + subquote_font.set_value(&conf.subquote_font); + subquote2_font.set_value(&conf.subquote2_font); + tag_font.set_value(&conf.tag_font); + tag2_font.set_value(&conf.tag2_font); quote_font_ratio.set_value(conf.quote_font_ratio); subquote_font_ratio.set_value(conf.subquote_font_ratio); subquote2_font_ratio.set_value(conf.subquote2_font_ratio); @@ -1036,6 +1055,7 @@ impl ConfigWindow { .insert(browse.selected_text().unwrap(), conf); }); + // Save Button let configs = Rc::clone(&self.configs); let did_save = Rc::clone(&self.did_save); let mut win = self.win.clone(); diff --git a/src/crop_window.rs b/src/crop_window.rs index f48d9b3..0b5f8e4 100644 --- a/src/crop_window.rs +++ b/src/crop_window.rs @@ -12,6 +12,7 @@ along with Post Maker. If not, see */ +//! Window to change Crop properties of image use crate::{ globals, utils::{self, Coord, ImageContainer, ImageProperties}, @@ -117,7 +118,7 @@ impl CropWindow { }; } - container.apply_scale(); + container.apply_resize(); let (image_width, image_height): (f64, f64) = Coord::from(container.image.dimensions()).into(); self.win.set_size(image_width as i32, 600); @@ -147,6 +148,7 @@ impl CropWindow { } } + /// Set drawing in window fn draw(&mut self) { let container = Rc::clone(&self.container); self.page.image_view.draw(move |f| { @@ -186,7 +188,9 @@ impl CropWindow { }); } + /// Set callbacks of elements fn event(&mut self) { + // Handle mosue events for crop area in image view let mut last: Option<(f64, f64)> = None; let container = Rc::clone(&self.container); self.page.image_view.handle(move |f, ev| { @@ -246,6 +250,7 @@ impl CropWindow { true }); + // Window close let mut wind = self.win.clone(); self.apply_btn.set_callback(move |_| { wind.do_callback(); diff --git a/src/draw_thread.rs b/src/draw_thread.rs index b40bfc0..63d849a 100644 --- a/src/draw_thread.rs +++ b/src/draw_thread.rs @@ -14,6 +14,7 @@ //! Thread to manage drawing in background +use crate::utils::{ImageContainer, ImageProperties}; use crate::{ main_window::{MainWindow, Page}, utils::{self, ImagePropertiesFile}, @@ -30,15 +31,12 @@ use fltk::{ prelude::*, valuator::Slider, }; - use std::{ fs, path::{Path, PathBuf}, sync::{mpsc, Arc, RwLock}, }; -use crate::utils::{ImageContainer, ImageProperties}; - #[derive(Debug, Clone)] pub(crate) enum DrawMessage { /// Open file or cropped file @@ -57,6 +55,7 @@ pub(crate) enum DrawMessage { Delete, } +/// Spawn thread to manage all actions related to image, like: edit, save, delete pub(crate) fn spawn_image_thread( reciver: mpsc::Receiver, app_sender: app::Sender, @@ -70,8 +69,8 @@ pub(crate) fn spawn_image_thread( let mut subquote2 = main_win.subquote2.clone(); let mut tag = main_win.tag.clone(); let mut tag2 = main_win.tag2.clone(); - let mut layer_rgb = main_win.layer_rgb.clone(); - let mut layer_alpha = main_win.layer_alpha.clone(); + let mut layer_rgb = main_win.translucent_layer_rgb.clone(); + let mut layer_alpha = main_win.translucent_layer_alpha.clone(); let mut quote_position = main_win.quote_position.clone(); let mut subquote_position = main_win.subquote_position.clone(); let mut subquote2_position = main_win.subquote2_position.clone(); @@ -217,6 +216,7 @@ pub(crate) fn spawn_image_thread( }); } +/// Loads the selected image in file_choice to ImageContainer to edit fn load_image( file_choice: &mut menu::Choice, images_path: Arc>>, @@ -313,8 +313,8 @@ fn load_image( tag2_position_slider.set_range(0.0, properties.original_dimension.1); tag2_position_slider.set_value(properties.tag2_position); - utils::set_color_btn_rgba(properties.color_layer, layer_rgb); - layer_alpha.set_value(properties.color_layer[3] as f64); + utils::set_color_btn_rgba(properties.translucent_layer_color, layer_rgb); + layer_alpha.set_value(properties.translucent_layer_color[3] as f64); dimension.set_label(&format!( "[{}x{}]", @@ -331,7 +331,7 @@ fn load_image( }, } - cont.apply_scale(); + cont.apply_resize(); let (width, height) = cont.properties.read().unwrap().dimension; page.col_flex.set_size(&page.image, height as i32); page.row_flex.set_size(&page.col_flex, width as i32); @@ -342,6 +342,8 @@ fn load_image( flush_buffer(&app_sender, &container); } +/// Flush the Buffer from image container to drawing buffer for fltk +// for drawing buffer for fltk (check in main.rs) fn flush_buffer(app_sender: &app::Sender, container: &Option) { match container { Some(cont) => { diff --git a/src/globals.rs b/src/globals.rs index bdd9fcb..91b27b3 100644 --- a/src/globals.rs +++ b/src/globals.rs @@ -18,14 +18,21 @@ use rusttype::Font; use std::{ffi::OsString, io::Read, sync::RwLock}; lazy_static! { + /// Theme for the GUI pub(crate) static ref THEME: config::Themes = - config::config().theme.unwrap_or(config::Themes::System); + config::args().theme.unwrap_or(config::Themes::System); + + /// Name of config to use pub(crate) static ref CONFIG_NAME: RwLock = RwLock::new("default".to_owned()); + + /// Loaded configuration pub(crate) static ref CONFIG: RwLock = RwLock::new(config::ConfigFile::load()); + + /// 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_ttf.as_str()) { + if let Ok(mut file) = std::fs::File::open(CONFIG.read().unwrap().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; @@ -37,9 +44,11 @@ lazy_static! { ) .unwrap() }; + + /// 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_ttf.as_str()) + if let Ok(mut file) = std::fs::File::open(CONFIG.read().unwrap().subquote_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { @@ -52,10 +61,12 @@ lazy_static! { ) .unwrap() }; + + /// TTF Font for Subquote 2 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_ttf.as_str()) + std::fs::File::open(CONFIG.read().unwrap().subquote2_font.as_str()) { if let Ok(_) = file.read_to_end(&mut buffer) { if let Some(out) = rusttype::Font::try_from_vec(buffer) { @@ -68,9 +79,11 @@ lazy_static! { ) .unwrap() }; + + /// 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_ttf.as_str()) { + if let Ok(mut file) = std::fs::File::open(&CONFIG.read().unwrap().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; @@ -80,9 +93,11 @@ lazy_static! { rusttype::Font::try_from_vec(include_bytes!("../assets/fonts/Kalam-Regular.ttf").to_vec()) .unwrap() }; + + /// 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_ttf.as_str()) { + if let Ok(mut file) = std::fs::File::open(&CONFIG.read().unwrap().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; @@ -94,7 +109,11 @@ lazy_static! { ) .unwrap() }; + + /// Image to use for Window pub(crate) static ref ICON: OsString = include_str!("../assets/icon.svg").into(); + + /// Image to use for Reload Button pub(crate) static ref RELOAD_ICON: OsString = { let img = include_str!("../assets/reload.svg"); if *THEME == config::Themes::Dark || *THEME == config::Themes::HighContrast { diff --git a/src/main.rs b/src/main.rs index 60aaaa9..50437f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,13 +32,13 @@ use fltk::{ prelude::*, }; use fltk_theme::WidgetTheme; -use simplelog::*; - use main_window::MainWindow; +use simplelog::*; use std::sync::{Arc, RwLock}; #[derive(Clone, Debug)] pub(crate) enum AppMessage { + /// Copy recived image buffer from draw_thread to Buffer for fltk frame RedrawMainWindowImage(Option>), } @@ -57,7 +57,9 @@ fn main() { lazy_static::initialize(&globals::CONFIG); + // Buffer which will br drawin on fltk frame let draw_buff: Arc>>> = Arc::new(RwLock::new(None)); + let (main_sender, main_receiver) = channel::(); let mut main_window = MainWindow::new(main_sender, Arc::clone(&draw_buff)); diff --git a/src/main_window.rs b/src/main_window.rs index 2f25fdf..3965817 100644 --- a/src/main_window.rs +++ b/src/main_window.rs @@ -12,6 +12,7 @@ along with Post Maker. If not, see */ +//! Main window where you do all editing use crate::crop_window::CropWindow; use crate::draw_thread::*; use crate::utils; @@ -44,14 +45,17 @@ pub(crate) struct MainWindow { pub(crate) back_btn: Button, pub(crate) next_btn: Button, pub(crate) save_btn: Button, + /// To choose the file which is being edited in directory pub(crate) file_choice: menu::Choice, pub(crate) quote: MultilineInput, pub(crate) subquote: MultilineInput, pub(crate) subquote2: MultilineInput, pub(crate) tag: Input, pub(crate) tag2: Input, - pub(crate) layer_rgb: Button, - pub(crate) layer_alpha: Spinner, + /// RGB value of top translucent layer + pub(crate) translucent_layer_rgb: Button, + /// opacity value of top translucent layer + pub(crate) translucent_layer_alpha: Spinner, pub(crate) quote_position: Spinner, pub(crate) subquote_position: Spinner, pub(crate) subquote2_position: Spinner, @@ -62,7 +66,7 @@ pub(crate) struct MainWindow { pub(crate) subquote2_position_slider: Slider, pub(crate) tag_position_slider: Slider, pub(crate) tag2_position_slider: Slider, - pub(crate) reset_darklayer_btn: Button, + pub(crate) reset_translucent_layer_btn: Button, pub(crate) reset_quote_position_btn: Button, pub(crate) reset_subquote_position_btn: Button, pub(crate) reset_subquote2_position_btn: Button, @@ -82,6 +86,7 @@ pub(crate) struct MainWindow { pub(crate) sender: mpsc::Sender, } +/// Contains the elements to draw page in mid of workspace #[derive(Clone)] pub(crate) struct Page { pub(crate) image: Frame, @@ -206,27 +211,27 @@ impl MainWindow { // Controls right let mut right_controls_flex = Flex::default().column(); - let mut darklayer_head_flex = Flex::default().row(); + let mut translucent_layer_head_flex = Flex::default().row(); Frame::default() - .with_label("Dark Layer (RGBA):") + .with_label("Translucent Layer:") .with_align(enums::Align::Left | enums::Align::Inside); let mut reset_darklayer_btn = Button::default(); reset_darklayer_btn.set_image(Some(reload_image.clone())); - darklayer_head_flex.set_size(&reset_darklayer_btn, 30); - darklayer_head_flex.end(); - right_controls_flex.set_size(&darklayer_head_flex, 30); + translucent_layer_head_flex.set_size(&reset_darklayer_btn, 30); + translucent_layer_head_flex.end(); + right_controls_flex.set_size(&translucent_layer_head_flex, 30); - let mut darklayer_flex = Flex::default().row(); - darklayer_flex.set_pad(2); - darklayer_flex.set_size(&Frame::default().with_label("Colour"), 50); - let mut layer_rgb = Button::default(); - layer_rgb.set_frame(enums::FrameType::BorderBox); + let mut translucent_layer_flex = Flex::default().row(); + translucent_layer_flex.set_pad(2); + translucent_layer_flex.set_size(&Frame::default().with_label("Colour"), 50); + let mut translucent_layer_rgb = Button::default(); + translucent_layer_rgb.set_frame(enums::FrameType::BorderBox); - darklayer_flex.set_size(&Frame::default().with_label("Alpha"), 50); - let mut layer_alpha = Spinner::default(); - layer_alpha.set_range(0.0, 255.0); - darklayer_flex.end(); - right_controls_flex.set_size(&darklayer_flex, 30); + translucent_layer_flex.set_size(&Frame::default().with_label("Alpha"), 50); + let mut translucent_layer_alpha = Spinner::default(); + translucent_layer_alpha.set_range(0.0, 255.0); + translucent_layer_flex.end(); + right_controls_flex.set_size(&translucent_layer_flex, 30); let mut quote_position_flex = Flex::default().row(); quote_position_flex.set_size( @@ -349,8 +354,8 @@ impl MainWindow { subquote2, tag, tag2, - layer_rgb, - layer_alpha, + translucent_layer_rgb, + translucent_layer_alpha, quote_position, subquote_position, subquote2_position, @@ -361,7 +366,7 @@ impl MainWindow { subquote2_position_slider, tag_position_slider, tag2_position_slider, - reset_darklayer_btn, + reset_translucent_layer_btn: reset_darklayer_btn, reset_quote_position_btn, reset_subquote_position_btn, reset_subquote2_position_btn, @@ -391,6 +396,7 @@ impl MainWindow { main_win } + /// Set menubar in window fn menu(&mut self) { let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); @@ -461,6 +467,7 @@ impl MainWindow { ); } + /// Set drawing in window fn draw(&mut self) { let buff = Arc::clone(&self.draw_buff); let properties = Arc::clone(&self.properties); @@ -480,7 +487,9 @@ impl MainWindow { }) } + /// Set callbacks of elements fn events(&mut self) { + // Resest Button for FileChoice let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); let imgs = Arc::clone(&self.images_path); @@ -492,15 +501,16 @@ impl MainWindow { load_dir(&path, Arc::clone(&imgs), &mut file_choice, &sender); }); - let mut layer_rgb = self.layer_rgb.clone(); - let mut layer_alpha = self.layer_alpha.clone(); + // Reset Button for Translucent Layer + let mut layer_rgb = self.translucent_layer_rgb.clone(); + let mut layer_alpha = self.translucent_layer_alpha.clone(); let mut image = self.page.image.clone(); let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); - self.reset_darklayer_btn.set_callback(move |_| { + self.reset_translucent_layer_btn.set_callback(move |_| { let mut prop = properties.write().unwrap(); let color = globals::CONFIG.read().unwrap().color_layer; - prop.color_layer = color; + prop.translucent_layer_color = color; prop.is_saved = false; utils::set_color_btn_rgba(color, &mut layer_rgb); layer_alpha.set_value(color[3] as f64); @@ -509,6 +519,7 @@ impl MainWindow { image.redraw(); }); + // Reset Button for Quote Input 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(); @@ -528,6 +539,7 @@ impl MainWindow { image.redraw(); }); + // Reset Button for Subquote Input let mut subquote_position = self.subquote_position.clone(); let mut subquote_position_slider = self.subquote_position_slider.clone(); let mut image = self.page.image.clone(); @@ -547,6 +559,7 @@ impl MainWindow { image.redraw(); }); + // Reset Button for Subquotes2 Input let mut subquote2_position = self.subquote2_position.clone(); let mut subquote2_position_slider = self.subquote2_position_slider.clone(); let mut image = self.page.image.clone(); @@ -566,6 +579,7 @@ impl MainWindow { image.redraw(); }); + // Reset Button for Tag Input 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(); @@ -585,6 +599,7 @@ impl MainWindow { image.redraw(); }); + // Reset Button for Tag2 Input let mut tag2_position = self.tag2_position.clone(); let mut tag2_position_slider = self.tag2_position_slider.clone(); let mut image = self.page.image.clone(); @@ -604,6 +619,7 @@ impl MainWindow { image.redraw(); }); + // Save Button let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.save_btn.set_callback(move |_| { @@ -612,6 +628,7 @@ impl MainWindow { sender.send(DrawMessage::Save).unwrap() }); + // Clone Button let mut image = self.page.image.clone(); let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); @@ -625,6 +642,7 @@ impl MainWindow { } }); + // Delete Button let mut image = self.page.image.clone(); let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); @@ -638,6 +656,7 @@ impl MainWindow { } }); + // Crop Button let properties = Arc::clone(&self.properties); let mut crop_win = CropWindow::new(); let sender = self.sender.clone(); @@ -651,6 +670,7 @@ impl MainWindow { } }); + // Next Image Button let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); @@ -673,6 +693,7 @@ impl MainWindow { sender.send(DrawMessage::Open).unwrap(); }); + // Back Image Button let mut file_choice = self.file_choice.clone(); let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); @@ -695,6 +716,7 @@ impl MainWindow { sender.send(DrawMessage::Open).unwrap(); }); + // File Choice let sender = self.sender.clone(); let properties = Arc::clone(&self.properties); self.file_choice.set_callback(move |_| { @@ -710,6 +732,7 @@ impl MainWindow { sender.send(DrawMessage::Open).unwrap(); }); + // Quote Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -725,6 +748,7 @@ impl MainWindow { true }); + // Subquote Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -740,6 +764,7 @@ impl MainWindow { true }); + // Subquote2 Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -755,6 +780,7 @@ impl MainWindow { true }); + // Tag Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -770,6 +796,7 @@ impl MainWindow { true }); + // Tag2 Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -785,6 +812,7 @@ impl MainWindow { true }); + // Quote Position Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -799,6 +827,7 @@ impl MainWindow { image.redraw(); }); + // Quote Position Slider let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -813,6 +842,7 @@ impl MainWindow { image.redraw(); }); + // Subquote Position Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -827,6 +857,7 @@ impl MainWindow { image.redraw(); }); + // Subquote Position Slider let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -841,6 +872,7 @@ impl MainWindow { image.redraw(); }); + // Subquote2 Position Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -855,6 +887,7 @@ impl MainWindow { image.redraw(); }); + // Subquote2 Position Slider let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -869,6 +902,7 @@ impl MainWindow { image.redraw(); }); + // Tag Position Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -883,6 +917,7 @@ impl MainWindow { image.redraw(); }); + // Tag Position Slider let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -897,6 +932,7 @@ impl MainWindow { image.redraw(); }); + // Tag2 Position Input let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -911,6 +947,7 @@ impl MainWindow { image.redraw(); }); + // Tag2 Position Slider let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); @@ -924,22 +961,24 @@ impl MainWindow { sender.send(DrawMessage::Flush).unwrap(); image.redraw(); }); + + // Translucent Layer RGB let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); - self.layer_rgb.set_callback(move |mut f| { + self.translucent_layer_rgb.set_callback(move |mut f| { let mut prop = properties.write().unwrap(); let (r, g, b) = dialog::color_chooser_with_default( "Pick a colour", dialog::ColorMode::Byte, ( - prop.color_layer[0], - prop.color_layer[1], - prop.color_layer[2], + prop.translucent_layer_color[0], + prop.translucent_layer_color[1], + prop.translucent_layer_color[2], ), ); - prop.color_layer = [r, g, b, prop.color_layer[3]]; - utils::set_color_btn_rgba(prop.color_layer, &mut f); + prop.translucent_layer_color = [r, g, b, prop.translucent_layer_color[3]]; + utils::set_color_btn_rgba(prop.translucent_layer_color, &mut f); f.redraw(); prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); @@ -947,12 +986,13 @@ impl MainWindow { image.redraw(); }); + // Translucent Layer Opacity let mut image = self.page.image.clone(); let properties = Arc::clone(&self.properties); let sender = self.sender.clone(); - self.layer_alpha.set_callback(move |f| { + self.translucent_layer_alpha.set_callback(move |f| { let mut prop = properties.write().unwrap(); - prop.color_layer[3] = f.value() as u8; + prop.translucent_layer_color[3] = f.value() as u8; prop.is_saved = false; sender.send(DrawMessage::RedrawToBuffer).unwrap(); sender.send(DrawMessage::Flush).unwrap(); @@ -961,6 +1001,7 @@ impl MainWindow { } } +/// Load all iamges in a directory fn load_dir( path: &PathBuf, imgs: Arc>>, diff --git a/src/utils.rs b/src/utils.rs index de55898..7774d8b 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -102,7 +102,8 @@ impl ImageContainer { } } - pub(crate) fn apply_scale(&mut self) { + /// Resize image + pub(crate) fn apply_resize(&mut self) { let mut prop = self.properties.write().unwrap(); let (width, height) = prop.dimension; let (s_width, s_height) = ((width * 500.0) / height, 500.0); @@ -113,6 +114,7 @@ impl ImageContainer { prop.dimension = (s_width, s_height); } + /// Crop Image pub(crate) fn apply_crop(&mut self) { let mut prop = self.properties.write().unwrap(); let (original_width, original_height) = prop.original_dimension; @@ -155,13 +157,14 @@ impl ImageContainer { self.buffer = self.image.clone(); } + /// 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 mut tmp = self.image.clone(); draw_layer_and_text( &mut tmp, - &prop.color_layer, + &prop.translucent_layer_color, &prop.quote, &prop.subquote, &prop.subquote2, @@ -178,6 +181,7 @@ impl ImageContainer { self.buffer = tmp; } + /// Save image anf properities pub(crate) fn save(&self) { let prop = self.properties.read().unwrap(); @@ -185,7 +189,7 @@ impl ImageContainer { Some(p) => Path::new(p), None => return, }; - let path_conf = path_original.with_extension("conf"); + let path_properties = path_original.with_extension("prop"); let export = path_original.parent().unwrap().join("export").join( path_original .with_extension("png") @@ -198,11 +202,11 @@ impl ImageContainer { let mut prop = prop.clone(); prop.path = None; if let Err(e) = fs::write( - &path_conf, + &path_properties, serde_json::to_string(&ImagePropertiesFile::from(&prop)).unwrap(), ) { - dialog::alert_default("Failed to save conf!"); - warn!("Failed to save conf!\n{:?}", e); + dialog::alert_default("Failed to save properties!"); + warn!("Failed to save properties!\n{:?}", e); } let mut img = image::open(&path_original).unwrap(); @@ -218,7 +222,7 @@ impl ImageContainer { draw_layer_and_text( &mut img, - &prop.color_layer, + &prop.translucent_layer_color, &prop.quote, &prop.subquote, &prop.subquote2, @@ -253,8 +257,8 @@ impl ImageContainer { i += 1; } - let path_conf = path.with_extension("conf"); - let path_conf_new = new_path.with_extension("conf"); + let path_properties = path.with_extension("prop"); + let path_properties_new = new_path.with_extension("prop"); if path.exists() { if let Err(e) = fs::copy(path, &new_path) { @@ -264,10 +268,10 @@ impl ImageContainer { } } - if path_conf.exists() { - if let Err(e) = fs::copy(path_conf, &path_conf_new) { - dialog::alert_default("Failed to clone image!"); - warn!("Failed to clone image!\n{:?}", e); + if path_properties.exists() { + if let Err(e) = fs::copy(path_properties, &path_properties_new) { + dialog::alert_default("Failed to clone image properties!"); + warn!("Failed to clone image properties!\n{:?}", e); } } Some(new_path) @@ -283,7 +287,7 @@ impl ImageContainer { Some(p) => Path::new(p), None => return, }; - let path_properties = path_original.with_extension("conf"); + let path_properties = path_original.with_extension("prop"); let export = path_original.parent().unwrap().join("export").join( path_original .with_extension("png") @@ -302,8 +306,8 @@ impl ImageContainer { if path_properties.exists() { if let Err(e) = fs::remove_file(path_properties) { - dialog::alert_default("Failed to delete image properties file!"); - warn!("Failed to delete image properties file!\n{:?}", e); + dialog::alert_default("Failed to delete image properties!"); + warn!("Failed to delete image properties!\n{:?}", e); } } @@ -316,10 +320,9 @@ impl ImageContainer { } } +/// Structure of Properties file of image to save and read #[derive(Serialize, Deserialize, Debug, Clone)] pub(crate) struct ImagePropertiesFile { - // pub(crate) dimension: Option<(f64, f64)>, - // pub(crate) original_dimension: Option<(f64, f64)>, pub(crate) crop_position: Option<(f64, f64)>, pub(crate) quote: Option, pub(crate) subquote: Option, @@ -331,14 +334,12 @@ pub(crate) struct ImagePropertiesFile { pub(crate) subquote2_position: Option, // as per original pub(crate) tag_position: Option, // as per original pub(crate) tag2_position: Option, // as per original - pub(crate) color_layer: Option<[u8; 4]>, + pub(crate) translucent_layer_color: Option<[u8; 4]>, } impl Default for ImagePropertiesFile { fn default() -> Self { Self { - // dimension: None, - // original_dimension: None, crop_position: None, quote: None, subquote: None, @@ -350,7 +351,7 @@ impl Default for ImagePropertiesFile { subquote2_position: None, tag_position: None, tag2_position: None, - color_layer: None, + translucent_layer_color: None, } } } @@ -358,8 +359,6 @@ impl Default for ImagePropertiesFile { impl From<&ImageProperties> for ImagePropertiesFile { fn from(props: &ImageProperties) -> Self { Self { - // dimension: Some(props.dimension), - // original_dimension: Some(props.original_dimension), crop_position: props.crop_position, quote: Some(props.quote.clone()), subquote: Some(props.subquote.clone()), @@ -371,11 +370,12 @@ impl From<&ImageProperties> for ImagePropertiesFile { subquote2_position: Some(props.subquote2_position), tag_position: Some(props.tag_position), tag2_position: Some(props.tag2_position), - color_layer: Some(props.color_layer), + translucent_layer_color: Some(props.translucent_layer_color), } } } +/// Properties of loaded image #[derive(Serialize, Deserialize, Debug, Clone)] pub(crate) struct ImageProperties { pub(crate) path: Option, @@ -392,7 +392,7 @@ pub(crate) struct ImageProperties { pub(crate) subquote2_position: f64, // as per original pub(crate) tag_position: f64, // as per original pub(crate) tag2_position: f64, // as per original - pub(crate) color_layer: [u8; 4], + pub(crate) translucent_layer_color: [u8; 4], pub(crate) is_saved: bool, } @@ -413,7 +413,7 @@ impl Default for ImageProperties { subquote2_position: 0.0, tag_position: 0.0, tag2_position: 0.0, - color_layer: [0; 4], + translucent_layer_color: [0; 4], is_saved: true, } } @@ -440,12 +440,13 @@ impl ImageProperties { self.subquote2_position = props.subquote2_position.unwrap_or(self.subquote2_position); self.tag_position = props.tag_position.unwrap_or(self.tag_position); self.tag2_position = props.tag2_position.unwrap_or(self.tag2_position); - self.color_layer = props - .color_layer + self.translucent_layer_color = props + .translucent_layer_color .unwrap_or(globals::CONFIG.read().unwrap().color_layer); } } +/// Draw text and stuffs on image fn draw_layer_and_text( tmp: &mut DynamicImage, rgba: &[u8; 4], @@ -526,6 +527,7 @@ fn draw_layer_and_text( } } +/// Draw multiline string on image pub(crate) fn draw_multiline_mid_string( tmp: &mut DynamicImage, font: &rusttype::Font, @@ -551,53 +553,7 @@ pub(crate) fn draw_multiline_mid_string( } } -// small hack because 0,0,0 rgb can't be set on theme -pub(crate) fn set_color_btn_rgba(rgba: [u8; 4], btn: &mut Button) { - let [mut r, g, b, _] = rgba; - if r == 0 && g == 0 && b == 0 { - r = 1; - } - btn.set_color(enums::Color::from_rgb(r, g, b)); -} - -pub(crate) fn croped_ratio(width: f64, height: f64) -> (f64, f64) { - if width > width_from_height(height) { - (width_from_height(height), height) - } else { - (width, height_from_width(width)) - } -} - -pub(crate) fn width_from_height(height: f64) -> f64 { - let (w, h) = globals::CONFIG.read().unwrap().image_ratio; - (w * height) / h -} - -pub(crate) fn height_from_width(width: f64) -> f64 { - let (w, h) = globals::CONFIG.read().unwrap().image_ratio; - (h * width) / w -} - -pub(crate) fn quote_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().quote_font_ratio) / 5000.0 -} - -pub(crate) fn subquote_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().subquote_font_ratio) / 5000.0 -} - -pub(crate) fn subquote2_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().subquote2_font_ratio) / 5000.0 -} - -pub(crate) fn tag_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().tag_font_ratio) / 5000.0 -} - -pub(crate) fn tag2_from_height(height: f64) -> f64 { - (height * globals::CONFIG.read().unwrap().tag2_font_ratio) / 5000.0 -} - +/// Get size of text to draw on image pub(crate) fn measure_line( font: &rusttype::Font, text: &str, @@ -614,3 +570,58 @@ pub(crate) fn measure_line( Coord::from((width, height)).into() } + +/// small hack because 0,0,0 rgb, because can't be set on fltk theme +pub(crate) fn set_color_btn_rgba(rgba: [u8; 4], btn: &mut Button) { + let [mut r, g, b, _] = rgba; + if r == 0 && g == 0 && b == 0 { + r = 1; + } + btn.set_color(enums::Color::from_rgb(r, g, b)); +} + +/// Get required size to crop image as per image ratio +pub(crate) fn croped_ratio(width: f64, height: f64) -> (f64, f64) { + if width > width_from_height(height) { + (width_from_height(height), height) + } else { + (width, height_from_width(width)) + } +} + +/// 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; + (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; + (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 +} + +/// 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 +} + +/// 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 +} + +/// 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 +} + +/// 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 +}