parent
f1c90e3a6f
commit
fd6619f2f7
|
|
@ -71,9 +71,9 @@ impl Default for ConfigFile {
|
||||||
Self {
|
Self {
|
||||||
quote_font_ttf: String::new(),
|
quote_font_ttf: String::new(),
|
||||||
tag_font_ttf: String::new(),
|
tag_font_ttf: String::new(),
|
||||||
quote_font_ratio: 259.0,
|
quote_font_ratio: 215.0,
|
||||||
tag_font_ratio: 96.0,
|
tag_font_ratio: 150.0,
|
||||||
color_layer: [25, 29, 34, 190],
|
color_layer: [20, 22, 25, 192],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ use fltk::{
|
||||||
menu,
|
menu,
|
||||||
misc::Spinner,
|
misc::Spinner,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
valuator::Slider,
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
|
|
@ -47,6 +48,8 @@ pub(crate) fn spawn_image_thread(
|
||||||
let mut layer_alpha = main_win.layer_alpha.clone();
|
let mut layer_alpha = main_win.layer_alpha.clone();
|
||||||
let mut quote_position = main_win.quote_position.clone();
|
let mut quote_position = main_win.quote_position.clone();
|
||||||
let mut tag_position = main_win.tag_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 page = main_win.page.clone();
|
||||||
let mut status = main_win.status.clone();
|
let mut status = main_win.status.clone();
|
||||||
let images_path = Arc::clone(&main_win.images_path);
|
let images_path = Arc::clone(&main_win.images_path);
|
||||||
|
|
@ -69,6 +72,8 @@ pub(crate) fn spawn_image_thread(
|
||||||
&mut layer_alpha,
|
&mut layer_alpha,
|
||||||
&mut quote_position,
|
&mut quote_position,
|
||||||
&mut tag_position,
|
&mut tag_position,
|
||||||
|
&mut quote_position_slider,
|
||||||
|
&mut tag_position_slider,
|
||||||
&mut page,
|
&mut page,
|
||||||
&app_sender,
|
&app_sender,
|
||||||
&properties,
|
&properties,
|
||||||
|
|
@ -93,6 +98,8 @@ pub(crate) fn spawn_image_thread(
|
||||||
&mut layer_alpha,
|
&mut layer_alpha,
|
||||||
&mut quote_position,
|
&mut quote_position,
|
||||||
&mut tag_position,
|
&mut tag_position,
|
||||||
|
&mut quote_position_slider,
|
||||||
|
&mut tag_position_slider,
|
||||||
&mut page,
|
&mut page,
|
||||||
&app_sender,
|
&app_sender,
|
||||||
&properties,
|
&properties,
|
||||||
|
|
@ -135,6 +142,8 @@ fn load_image(
|
||||||
layer_alpha: &mut Spinner,
|
layer_alpha: &mut Spinner,
|
||||||
quote_position: &mut Spinner,
|
quote_position: &mut Spinner,
|
||||||
tag_position: &mut Spinner,
|
tag_position: &mut Spinner,
|
||||||
|
quote_position_slider: &mut Slider,
|
||||||
|
tag_position_slider: &mut Slider,
|
||||||
page: &mut Page,
|
page: &mut Page,
|
||||||
app_sender: &app::Sender<crate::AppMessage>,
|
app_sender: &app::Sender<crate::AppMessage>,
|
||||||
properties: &Arc<RwLock<ImageProperties>>,
|
properties: &Arc<RwLock<ImageProperties>>,
|
||||||
|
|
@ -167,6 +176,10 @@ fn load_image(
|
||||||
quote_position.set_value(saved_prop.quote_position);
|
quote_position.set_value(saved_prop.quote_position);
|
||||||
tag_position.set_range(0.0, prop.original_dimension.1);
|
tag_position.set_range(0.0, prop.original_dimension.1);
|
||||||
tag_position.set_value(saved_prop.tag_position);
|
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.quote = saved_prop.quote;
|
||||||
prop.tag = saved_prop.tag;
|
prop.tag = saved_prop.tag;
|
||||||
|
|
@ -197,6 +210,10 @@ fn load_image(
|
||||||
quote_position.set_value(prop.quote_position);
|
quote_position.set_value(prop.quote_position);
|
||||||
tag_position.set_range(0.0, prop.original_dimension.1);
|
tag_position.set_range(0.0, prop.original_dimension.1);
|
||||||
tag_position.set_value(prop.tag_position);
|
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();
|
let glob = &globals::CONFIG.read().unwrap();
|
||||||
layer_red.set_value(glob.color_layer[0] as f64);
|
layer_red.set_value(glob.color_layer[0] as f64);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use crate::crop_window::CropWindow;
|
||||||
use crate::draw_thread::*;
|
use crate::draw_thread::*;
|
||||||
use crate::utils::ImageProperties;
|
use crate::utils::ImageProperties;
|
||||||
use crate::{config_window::ConfigWindow, globals};
|
use crate::{config_window::ConfigWindow, globals};
|
||||||
|
use fltk::valuator::{Slider, SliderType};
|
||||||
use fltk::{
|
use fltk::{
|
||||||
app,
|
app,
|
||||||
button::Button,
|
button::Button,
|
||||||
|
|
@ -36,9 +37,12 @@ pub(crate) struct MainWindow {
|
||||||
pub(crate) layer_alpha: Spinner,
|
pub(crate) layer_alpha: Spinner,
|
||||||
pub(crate) quote_position: Spinner,
|
pub(crate) quote_position: Spinner,
|
||||||
pub(crate) tag_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_darklayer_btn: Button,
|
||||||
pub(crate) reset_quote_position_btn: Button,
|
pub(crate) reset_quote_position_btn: Button,
|
||||||
pub(crate) reset_tag_position_btn: Button,
|
pub(crate) reset_tag_position_btn: Button,
|
||||||
|
pub(crate) reset_file_choice: Button,
|
||||||
pub(crate) crop_btn: Button,
|
pub(crate) crop_btn: Button,
|
||||||
pub(crate) status: Frame,
|
pub(crate) status: Frame,
|
||||||
pub(crate) page: Page,
|
pub(crate) page: Page,
|
||||||
|
|
@ -77,6 +81,8 @@ impl MainWindow {
|
||||||
let save_btn = Button::default().with_label("Save");
|
let save_btn = Button::default().with_label("Save");
|
||||||
toolbar_flex.set_size(&save_btn, 50);
|
toolbar_flex.set_size(&save_btn, 50);
|
||||||
let file_choice = menu::Choice::default();
|
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();
|
toolbar_flex.end();
|
||||||
main_flex.set_size(&toolbar_flex, 30);
|
main_flex.set_size(&toolbar_flex, 30);
|
||||||
|
|
||||||
|
|
@ -140,6 +146,10 @@ impl MainWindow {
|
||||||
quote_position_flex.end();
|
quote_position_flex.end();
|
||||||
controls_flex.set_size("e_position_flex, 30);
|
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();
|
let mut tag_position_flex = Flex::default().row();
|
||||||
Frame::default()
|
Frame::default()
|
||||||
.with_label("Tag Position:")
|
.with_label("Tag Position:")
|
||||||
|
|
@ -150,6 +160,10 @@ impl MainWindow {
|
||||||
tag_position_flex.end();
|
tag_position_flex.end();
|
||||||
controls_flex.set_size(&tag_position_flex, 30);
|
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();
|
let mut actions_flex = Flex::default().row();
|
||||||
Frame::default();
|
Frame::default();
|
||||||
let crop_btn = Button::default().with_label("Crop");
|
let crop_btn = Button::default().with_label("Crop");
|
||||||
|
|
@ -203,9 +217,12 @@ impl MainWindow {
|
||||||
layer_alpha,
|
layer_alpha,
|
||||||
quote_position,
|
quote_position,
|
||||||
tag_position,
|
tag_position,
|
||||||
|
quote_position_slider,
|
||||||
|
tag_position_slider,
|
||||||
reset_darklayer_btn,
|
reset_darklayer_btn,
|
||||||
reset_quote_position_btn,
|
reset_quote_position_btn,
|
||||||
reset_tag_position_btn,
|
reset_tag_position_btn,
|
||||||
|
reset_file_choice,
|
||||||
crop_btn,
|
crop_btn,
|
||||||
status,
|
status,
|
||||||
images_path: Arc::new(RwLock::new(vec![])),
|
images_path: Arc::new(RwLock::new(vec![])),
|
||||||
|
|
@ -228,20 +245,17 @@ impl MainWindow {
|
||||||
fn menu(&mut self) {
|
fn menu(&mut self) {
|
||||||
let mut file_choice = self.file_choice.clone();
|
let mut file_choice = self.file_choice.clone();
|
||||||
let sender = self.sender.clone();
|
let sender = self.sender.clone();
|
||||||
let mut win = self.win.clone();
|
|
||||||
let imgs = Arc::clone(&self.images_path);
|
let imgs = Arc::clone(&self.images_path);
|
||||||
self.menubar.add(
|
self.menubar.add(
|
||||||
"&File/Open Folder...\t",
|
"&File/Open Folder...\t",
|
||||||
Shortcut::Ctrl | 'o',
|
Shortcut::Ctrl | 'o',
|
||||||
menu::MenuFlag::Normal,
|
menu::MenuFlag::Normal,
|
||||||
move |_| {
|
move |_| {
|
||||||
win.redraw();
|
|
||||||
let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseDir);
|
let mut chooser = NativeFileChooser::new(fltk::dialog::FileDialogType::BrowseDir);
|
||||||
chooser.set_option(fltk::dialog::FileDialogOptions::NewFolder);
|
chooser.set_option(fltk::dialog::FileDialogOptions::NewFolder);
|
||||||
chooser.show();
|
chooser.show();
|
||||||
let path = chooser.filename();
|
let path = chooser.filename();
|
||||||
if !path.exists() {
|
if !path.exists() {
|
||||||
win.activate();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let expost_dir = path.join("export");
|
let expost_dir = path.join("export");
|
||||||
|
|
@ -251,28 +265,7 @@ impl MainWindow {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let files = fs::read_dir(&path).unwrap();
|
load_dir(&path, Arc::clone(&imgs), &mut file_choice, &sender);
|
||||||
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();
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -325,6 +318,17 @@ impl MainWindow {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn events(&mut self) {
|
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_red = self.layer_red.clone();
|
||||||
let mut layer_green = self.layer_green.clone();
|
let mut layer_green = self.layer_green.clone();
|
||||||
let mut layer_blue = self.layer_blue.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 = self.quote_position.clone();
|
||||||
|
let mut quote_position_slider = self.quote_position_slider.clone();
|
||||||
let mut image = self.page.image.clone();
|
let mut image = self.page.image.clone();
|
||||||
let sender = self.sender.clone();
|
let sender = self.sender.clone();
|
||||||
let properties = Arc::clone(&self.properties);
|
let properties = Arc::clone(&self.properties);
|
||||||
|
|
@ -357,6 +362,7 @@ impl MainWindow {
|
||||||
prop.quote_position = pos;
|
prop.quote_position = pos;
|
||||||
prop.is_saved = false;
|
prop.is_saved = false;
|
||||||
quote_position.set_value(pos);
|
quote_position.set_value(pos);
|
||||||
|
quote_position_slider.set_value(pos);
|
||||||
|
|
||||||
sender.send(DrawMessage::Recalc).unwrap();
|
sender.send(DrawMessage::Recalc).unwrap();
|
||||||
sender.send(DrawMessage::Flush).unwrap();
|
sender.send(DrawMessage::Flush).unwrap();
|
||||||
|
|
@ -364,6 +370,7 @@ impl MainWindow {
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut tag_position = self.tag_position.clone();
|
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 mut image = self.page.image.clone();
|
||||||
let sender = self.sender.clone();
|
let sender = self.sender.clone();
|
||||||
let properties = Arc::clone(&self.properties);
|
let properties = Arc::clone(&self.properties);
|
||||||
|
|
@ -374,6 +381,7 @@ impl MainWindow {
|
||||||
prop.tag_position = pos;
|
prop.tag_position = pos;
|
||||||
prop.is_saved = false;
|
prop.is_saved = false;
|
||||||
tag_position.set_value(pos);
|
tag_position.set_value(pos);
|
||||||
|
tag_position_slider.set_value(pos);
|
||||||
|
|
||||||
sender.send(DrawMessage::Recalc).unwrap();
|
sender.send(DrawMessage::Recalc).unwrap();
|
||||||
sender.send(DrawMessage::Flush).unwrap();
|
sender.send(DrawMessage::Flush).unwrap();
|
||||||
|
|
@ -493,9 +501,11 @@ impl MainWindow {
|
||||||
let mut image = self.page.image.clone();
|
let mut image = self.page.image.clone();
|
||||||
let properties = Arc::clone(&self.properties);
|
let properties = Arc::clone(&self.properties);
|
||||||
let sender = self.sender.clone();
|
let sender = self.sender.clone();
|
||||||
|
let mut quote_position_slider = self.quote_position_slider.clone();
|
||||||
self.quote_position.set_callback(move |f| {
|
self.quote_position.set_callback(move |f| {
|
||||||
let mut prop = properties.write().unwrap();
|
let mut prop = properties.write().unwrap();
|
||||||
prop.quote_position = f.value();
|
prop.quote_position = f.value();
|
||||||
|
quote_position_slider.set_value(f.value());
|
||||||
prop.is_saved = false;
|
prop.is_saved = false;
|
||||||
sender.send(DrawMessage::Recalc).unwrap();
|
sender.send(DrawMessage::Recalc).unwrap();
|
||||||
sender.send(DrawMessage::Flush).unwrap();
|
sender.send(DrawMessage::Flush).unwrap();
|
||||||
|
|
@ -505,9 +515,39 @@ impl MainWindow {
|
||||||
let mut image = self.page.image.clone();
|
let mut image = self.page.image.clone();
|
||||||
let properties = Arc::clone(&self.properties);
|
let properties = Arc::clone(&self.properties);
|
||||||
let sender = self.sender.clone();
|
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| {
|
self.tag_position.set_callback(move |f| {
|
||||||
let mut prop = properties.write().unwrap();
|
let mut prop = properties.write().unwrap();
|
||||||
prop.tag_position = f.value();
|
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;
|
prop.is_saved = false;
|
||||||
sender.send(DrawMessage::Recalc).unwrap();
|
sender.send(DrawMessage::Recalc).unwrap();
|
||||||
sender.send(DrawMessage::Flush).unwrap();
|
sender.send(DrawMessage::Flush).unwrap();
|
||||||
|
|
@ -563,3 +603,32 @@ impl MainWindow {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn load_dir(
|
||||||
|
path: &PathBuf,
|
||||||
|
imgs: Arc<RwLock<Vec<PathBuf>>>,
|
||||||
|
file_choice: &mut menu::Choice,
|
||||||
|
sender: &mpsc::Sender<DrawMessage>,
|
||||||
|
) {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue