Minimum/Maximum
This commit is contained in:
parent
4d516dfe91
commit
f3a4ca7c2e
|
@ -1,4 +1,3 @@
|
||||||
use crate::common::create_vec_model_from_vec_string;
|
|
||||||
use crate::settings::{collect_settings, SettingsCustom};
|
use crate::settings::{collect_settings, SettingsCustom};
|
||||||
use crate::{CurrentTab, GuiState, MainListModel, MainWindow, ProgressToSend};
|
use crate::{CurrentTab, GuiState, MainListModel, MainWindow, ProgressToSend};
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
|
@ -54,8 +53,7 @@ fn scan_similar_images(a: Weak<MainWindow>, progress_sender: Sender<ProgressData
|
||||||
.stack_size(DEFAULT_THREAD_SIZE)
|
.stack_size(DEFAULT_THREAD_SIZE)
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
let mut finder = SimilarImages::new();
|
let mut finder = SimilarImages::new();
|
||||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
set_common_settings(&mut finder, &custom_settings);
|
||||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
|
||||||
finder.find_similar_images(Some(&stop_receiver), Some(&progress_sender));
|
finder.find_similar_images(Some(&stop_receiver), Some(&progress_sender));
|
||||||
|
|
||||||
let mut vector = finder.get_similar_images().clone();
|
let mut vector = finder.get_similar_images().clone();
|
||||||
|
@ -71,30 +69,19 @@ fn scan_similar_images(a: Weak<MainWindow>, progress_sender: Sender<ProgressData
|
||||||
let number_of_empty_files = vector.len();
|
let number_of_empty_files = vector.len();
|
||||||
let items = Rc::new(VecModel::default());
|
let items = Rc::new(VecModel::default());
|
||||||
for vec_fe in vector {
|
for vec_fe in vector {
|
||||||
items.push(MainListModel {
|
insert_data_to_model(&items, ModelRc::new(VecModel::default()), false);
|
||||||
checked: false,
|
|
||||||
header_row: true,
|
|
||||||
selected_row: false,
|
|
||||||
val: ModelRc::new(VecModel::default()),
|
|
||||||
});
|
|
||||||
for fe in vec_fe {
|
for fe in vec_fe {
|
||||||
let (directory, file) = split_path(fe.get_path());
|
let (directory, file) = split_path(fe.get_path());
|
||||||
let data_model = create_vec_model_from_vec_string(vec![
|
let data_model = VecModel::from_slice(&[
|
||||||
similar_images::get_string_from_similarity(&fe.similarity, hash_size),
|
similar_images::get_string_from_similarity(&fe.similarity, hash_size).into(),
|
||||||
format_size(fe.size, BINARY),
|
format_size(fe.size, BINARY).into(),
|
||||||
fe.dimensions.clone(),
|
fe.dimensions.clone().into(),
|
||||||
file,
|
file.into(),
|
||||||
directory,
|
directory.into(),
|
||||||
NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string(),
|
NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string().into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let main = MainListModel {
|
insert_data_to_model(&items, data_model, false);
|
||||||
checked: false,
|
|
||||||
header_row: false,
|
|
||||||
selected_row: false,
|
|
||||||
val: ModelRc::new(data_model),
|
|
||||||
};
|
|
||||||
items.push(main);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
app.set_similar_images_model(items.into());
|
app.set_similar_images_model(items.into());
|
||||||
|
@ -110,8 +97,7 @@ fn scan_empty_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>,
|
||||||
.stack_size(DEFAULT_THREAD_SIZE)
|
.stack_size(DEFAULT_THREAD_SIZE)
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
let mut finder = EmptyFiles::new();
|
let mut finder = EmptyFiles::new();
|
||||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
set_common_settings(&mut finder, &custom_settings);
|
||||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
|
||||||
finder.find_empty_files(Some(&stop_receiver), Some(&progress_sender));
|
finder.find_empty_files(Some(&stop_receiver), Some(&progress_sender));
|
||||||
|
|
||||||
let mut vector = finder.get_empty_files().clone();
|
let mut vector = finder.get_empty_files().clone();
|
||||||
|
@ -128,18 +114,12 @@ fn scan_empty_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>,
|
||||||
for fe in vector {
|
for fe in vector {
|
||||||
let (directory, file) = split_path(fe.get_path());
|
let (directory, file) = split_path(fe.get_path());
|
||||||
let data_model = VecModel::from_slice(&[
|
let data_model = VecModel::from_slice(&[
|
||||||
SharedString::from(file),
|
file.into(),
|
||||||
SharedString::from(directory),
|
directory.into(),
|
||||||
SharedString::from(NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string()),
|
NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string().into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let main = MainListModel {
|
insert_data_to_model(&items, data_model, false);
|
||||||
checked: false,
|
|
||||||
header_row: false,
|
|
||||||
selected_row: false,
|
|
||||||
val: ModelRc::new(data_model),
|
|
||||||
};
|
|
||||||
items.push(main);
|
|
||||||
}
|
}
|
||||||
app.set_empty_files_model(items.into());
|
app.set_empty_files_model(items.into());
|
||||||
app.invoke_scan_ended(format!("Found {} empty files", number_of_empty_files).into());
|
app.invoke_scan_ended(format!("Found {} empty files", number_of_empty_files).into());
|
||||||
|
@ -154,8 +134,7 @@ fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>
|
||||||
.stack_size(DEFAULT_THREAD_SIZE)
|
.stack_size(DEFAULT_THREAD_SIZE)
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
let mut finder = EmptyFolder::new();
|
let mut finder = EmptyFolder::new();
|
||||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
set_common_settings(&mut finder, &custom_settings);
|
||||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
|
||||||
finder.find_empty_folders(Some(&stop_receiver), Some(&progress_sender));
|
finder.find_empty_folders(Some(&stop_receiver), Some(&progress_sender));
|
||||||
|
|
||||||
let mut vector = finder.get_empty_folder_list().keys().cloned().collect::<Vec<PathBuf>>();
|
let mut vector = finder.get_empty_folder_list().keys().cloned().collect::<Vec<PathBuf>>();
|
||||||
|
@ -172,18 +151,12 @@ fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>
|
||||||
for path in vector {
|
for path in vector {
|
||||||
let (directory, file) = split_path(&path);
|
let (directory, file) = split_path(&path);
|
||||||
let data_model = VecModel::from_slice(&[
|
let data_model = VecModel::from_slice(&[
|
||||||
SharedString::from(file),
|
file.into(),
|
||||||
SharedString::from(directory),
|
directory.into(),
|
||||||
SharedString::from(NaiveDateTime::from_timestamp_opt(folder_map[&path].modified_date as i64, 0).unwrap().to_string()),
|
NaiveDateTime::from_timestamp_opt(folder_map[&path].modified_date as i64, 0).unwrap().to_string().into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let main = MainListModel {
|
insert_data_to_model(&items, data_model, false);
|
||||||
checked: false,
|
|
||||||
header_row: false,
|
|
||||||
selected_row: false,
|
|
||||||
val: ModelRc::new(data_model),
|
|
||||||
};
|
|
||||||
items.push(main);
|
|
||||||
}
|
}
|
||||||
app.set_empty_folder_model(items.into());
|
app.set_empty_folder_model(items.into());
|
||||||
app.invoke_scan_ended(format!("Found {} empty folders", folder_map.len()).into());
|
app.invoke_scan_ended(format!("Found {} empty folders", folder_map.len()).into());
|
||||||
|
@ -192,3 +165,26 @@ fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn insert_data_to_model(items: &Rc<VecModel<MainListModel>>, data_model: ModelRc<SharedString>, header_row: bool) {
|
||||||
|
let main = MainListModel {
|
||||||
|
checked: false,
|
||||||
|
header_row,
|
||||||
|
selected_row: false,
|
||||||
|
val: ModelRc::new(data_model),
|
||||||
|
};
|
||||||
|
items.push(main);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_common_settings<T>(component: &mut T, custom_settings: &SettingsCustom)
|
||||||
|
where
|
||||||
|
T: CommonData,
|
||||||
|
{
|
||||||
|
component.set_included_directory(custom_settings.included_directories.clone());
|
||||||
|
component.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||||
|
component.set_recursive_search(true); // TODO bind
|
||||||
|
component.set_minimal_file_size(custom_settings.minimum_file_size as u64 * 1024);
|
||||||
|
component.set_minimal_file_size(custom_settings.maximum_file_size as u64 * 1024);
|
||||||
|
component.set_allowed_extensions(custom_settings.allowed_extensions.clone());
|
||||||
|
component.set_excluded_items(custom_settings.excluded_items.split(',').map(str::to_string).collect());
|
||||||
|
}
|
||||||
|
|
|
@ -12,6 +12,9 @@ use log::{debug, error, info};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use slint::{ComponentHandle, Model, ModelRc};
|
use slint::{ComponentHandle, Model, ModelRc};
|
||||||
|
|
||||||
|
pub const DEFAULT_MINIMUM_SIZE: i32 = 16 * 1024;
|
||||||
|
pub const DEFAULT_MAXIMUM_SIZE: i32 = i32::MAX;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub struct SettingsCustom {
|
pub struct SettingsCustom {
|
||||||
#[serde(default = "default_included_directories")]
|
#[serde(default = "default_included_directories")]
|
||||||
|
@ -133,7 +136,7 @@ pub fn create_default_settings_files() {
|
||||||
pub fn load_settings_from_file(app: &MainWindow) {
|
pub fn load_settings_from_file(app: &MainWindow) {
|
||||||
let result_base_settings = load_data_from_file::<BasicSettings>(get_base_config_file());
|
let result_base_settings = load_data_from_file::<BasicSettings>(get_base_config_file());
|
||||||
|
|
||||||
let base_settings;
|
let mut base_settings;
|
||||||
if let Ok(base_settings_temp) = result_base_settings {
|
if let Ok(base_settings_temp) = result_base_settings {
|
||||||
base_settings = base_settings_temp;
|
base_settings = base_settings_temp;
|
||||||
} else {
|
} else {
|
||||||
|
@ -151,6 +154,18 @@ pub fn load_settings_from_file(app: &MainWindow) {
|
||||||
custom_settings = SettingsCustom::default();
|
custom_settings = SettingsCustom::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate here values and set "proper"
|
||||||
|
// preset_names should have 10 items
|
||||||
|
if base_settings.preset_names.len() > 10 {
|
||||||
|
base_settings.preset_names.truncate(10);
|
||||||
|
} else if base_settings.preset_names.len() < 10 {
|
||||||
|
while base_settings.preset_names.len() < 10 {
|
||||||
|
base_settings.preset_names.push(format!("Preset {}", base_settings.preset_names.len() + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
base_settings.default_preset = max(min(base_settings.default_preset, 9), 0);
|
||||||
|
|
||||||
|
// Ended validating
|
||||||
set_settings_to_gui(app, &custom_settings);
|
set_settings_to_gui(app, &custom_settings);
|
||||||
set_base_settings_to_gui(app, &base_settings);
|
set_base_settings_to_gui(app, &base_settings);
|
||||||
}
|
}
|
||||||
|
@ -241,8 +256,6 @@ pub fn get_base_config_file() -> Option<PathBuf> {
|
||||||
Some(base_config_file)
|
Some(base_config_file)
|
||||||
}
|
}
|
||||||
pub fn get_config_file(number: i32) -> Option<PathBuf> {
|
pub fn get_config_file(number: i32) -> Option<PathBuf> {
|
||||||
let number = max(min(number, 9), 0);
|
|
||||||
|
|
||||||
let Some(configs) = ProjectDirs::from("pl", "Qarmin", "Krokiet") else {
|
let Some(configs) = ProjectDirs::from("pl", "Qarmin", "Krokiet") else {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
@ -270,8 +283,8 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||||
|
|
||||||
settings.set_excluded_items(custom_settings.excluded_items.clone().into());
|
settings.set_excluded_items(custom_settings.excluded_items.clone().into());
|
||||||
settings.set_allowed_extensions(custom_settings.allowed_extensions.clone().into());
|
settings.set_allowed_extensions(custom_settings.allowed_extensions.clone().into());
|
||||||
settings.set_minimum_file_size(custom_settings.minimum_file_size);
|
settings.set_minimum_file_size(custom_settings.minimum_file_size.to_string().into());
|
||||||
settings.set_maximum_file_size(custom_settings.maximum_file_size);
|
settings.set_maximum_file_size(custom_settings.maximum_file_size.to_string().into());
|
||||||
|
|
||||||
// Clear text
|
// Clear text
|
||||||
app.global::<GuiState>().set_info_text("".into());
|
app.global::<GuiState>().set_info_text("".into());
|
||||||
|
@ -288,8 +301,8 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
|
||||||
|
|
||||||
let excluded_items = settings.get_excluded_items().to_string();
|
let excluded_items = settings.get_excluded_items().to_string();
|
||||||
let allowed_extensions = settings.get_allowed_extensions().to_string();
|
let allowed_extensions = settings.get_allowed_extensions().to_string();
|
||||||
let minimum_file_size = settings.get_minimum_file_size();
|
let minimum_file_size = settings.get_minimum_file_size().parse::<i32>().unwrap_or(DEFAULT_MINIMUM_SIZE);
|
||||||
let maximum_file_size = settings.get_maximum_file_size();
|
let maximum_file_size = settings.get_maximum_file_size().parse::<i32>().unwrap_or(DEFAULT_MAXIMUM_SIZE);
|
||||||
|
|
||||||
SettingsCustom {
|
SettingsCustom {
|
||||||
included_directories,
|
included_directories,
|
||||||
|
@ -364,8 +377,8 @@ fn default_preset_names() -> Vec<String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn minimum_file_size() -> i32 {
|
fn minimum_file_size() -> i32 {
|
||||||
16
|
DEFAULT_MINIMUM_SIZE
|
||||||
}
|
}
|
||||||
fn maximum_file_size() -> i32 {
|
fn maximum_file_size() -> i32 {
|
||||||
i32::MAX
|
DEFAULT_MAXIMUM_SIZE
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ export component ActionButtons inherits HorizontalLayout {
|
||||||
Rectangle {
|
Rectangle {
|
||||||
scan_button := Button {
|
scan_button := Button {
|
||||||
height: parent.height;
|
height: parent.height;
|
||||||
enabled: !scanning;
|
enabled: !scanning && active-tab != CurrentTab.Settings;
|
||||||
visible: !scanning;
|
visible: !scanning;
|
||||||
text: "Scan";
|
text: "Scan";
|
||||||
clicked => {
|
clicked => {
|
||||||
|
|
|
@ -8,7 +8,7 @@ export global Settings {
|
||||||
// Settings
|
// Settings
|
||||||
in-out property <string> excluded_items: "Excluded items";
|
in-out property <string> excluded_items: "Excluded items";
|
||||||
in-out property <string> allowed_extensions: "Allowed extensions";
|
in-out property <string> allowed_extensions: "Allowed extensions";
|
||||||
in-out property <int> minimum_file_size: 0;
|
in-out property <string> minimum_file_size: 0;
|
||||||
in-out property <int> maximum_file_size: 0;
|
in-out property <string> maximum_file_size: 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ import { Button, VerticalBox , HorizontalBox, TabWidget, ListView, StandardListV
|
||||||
import { Settings } from "settings.slint";
|
import { Settings } from "settings.slint";
|
||||||
import { Callabler } from "callabler.slint";
|
import { Callabler } from "callabler.slint";
|
||||||
|
|
||||||
|
// TODO use Spinbox instead LineEdit {} to be able to set only numbers
|
||||||
|
|
||||||
global SettingsSize {
|
global SettingsSize {
|
||||||
out property <length> item_height: 30px;
|
out property <length> item_height: 30px;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +28,7 @@ component MinMaxSizeComponent inherits HorizontalLayout {
|
||||||
spacing: 20px;
|
spacing: 20px;
|
||||||
Text {
|
Text {
|
||||||
horizontal-stretch: 0.0;
|
horizontal-stretch: 0.0;
|
||||||
text:"Items Size(Kb)";
|
text:"Items Size(Bytes)";
|
||||||
vertical-alignment: TextVerticalAlignment.center;
|
vertical-alignment: TextVerticalAlignment.center;
|
||||||
}
|
}
|
||||||
HorizontalLayout {
|
HorizontalLayout {
|
||||||
|
@ -36,21 +38,17 @@ component MinMaxSizeComponent inherits HorizontalLayout {
|
||||||
text:"Min:";
|
text:"Min:";
|
||||||
vertical-alignment: TextVerticalAlignment.center;
|
vertical-alignment: TextVerticalAlignment.center;
|
||||||
}
|
}
|
||||||
SpinBox {
|
LineEdit {
|
||||||
enabled: true;
|
|
||||||
maximum: 999999999999999;
|
|
||||||
height: SettingsSize.item_height;
|
height: SettingsSize.item_height;
|
||||||
value <=> Settings.minimum_file_size;
|
text <=> Settings.minimum_file_size;
|
||||||
}
|
}
|
||||||
Text {
|
Text {
|
||||||
text:"Max:";
|
text:"Max:";
|
||||||
vertical-alignment: TextVerticalAlignment.center;
|
vertical-alignment: TextVerticalAlignment.center;
|
||||||
}
|
}
|
||||||
SpinBox {
|
LineEdit {
|
||||||
enabled: true;
|
|
||||||
maximum: 999999999999999;
|
|
||||||
height: SettingsSize.item_height;
|
height: SettingsSize.item_height;
|
||||||
value <=> Settings.maximum_file_size;
|
text <=> Settings.maximum_file_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue