1
0
Fork 0
mirror of synced 2024-05-03 12:03:22 +12:00
This commit is contained in:
Rafał Mikrut 2024-02-07 10:23:01 +01:00
parent 1181368fc2
commit 1844f69b71
8 changed files with 311 additions and 410 deletions

116
Cargo.lock generated
View file

@ -654,23 +654,22 @@ dependencies = [
[[package]]
name = "cairo-rs"
version = "0.18.5"
version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
checksum = "bc1c415b7088381c53c575420899c34c9e6312df5ac5defd05614210e9fd6e1b"
dependencies = [
"bitflags 2.4.2",
"cairo-sys-rs",
"glib",
"libc",
"once_cell",
"thiserror",
]
[[package]]
name = "cairo-sys-rs"
version = "0.18.2"
version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
checksum = "75b6a5fefce2eadb8333e3c604ac964ba6573ec4f28bdd17f67032c4a2831831"
dependencies = [
"glib-sys",
"libc",
@ -2148,22 +2147,21 @@ dependencies = [
[[package]]
name = "gdk-pixbuf"
version = "0.18.5"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
checksum = "c311c47800051b87de1335e8792774d7cec551c91a0a3d109ab21d76b36f208f"
dependencies = [
"gdk-pixbuf-sys",
"gio",
"glib",
"libc",
"once_cell",
]
[[package]]
name = "gdk-pixbuf-sys"
version = "0.18.0"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
checksum = "3dcbd04c1b2c4834cc008b4828bc917d062483b88d26effde6342e5622028f96"
dependencies = [
"gio-sys",
"glib-sys",
@ -2174,9 +2172,9 @@ dependencies = [
[[package]]
name = "gdk4"
version = "0.7.3"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6"
checksum = "6771942f85a2beaa220c64739395e4401b9fab4a52aba9b503fa1e6ed4d4d806"
dependencies = [
"cairo-rs",
"gdk-pixbuf",
@ -2189,9 +2187,9 @@ dependencies = [
[[package]]
name = "gdk4-sys"
version = "0.7.2"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0"
checksum = "1eb95854fab65072023a7814434f003db571d6e45c287c0b0c540c1c78bdf6ae"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@ -2279,9 +2277,9 @@ dependencies = [
[[package]]
name = "gio"
version = "0.18.4"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
checksum = "b3d1aaa2d926710a27f3b35822806b1513b393b71174dd2601c9d02fdab0cb82"
dependencies = [
"futures-channel",
"futures-core",
@ -2290,7 +2288,6 @@ dependencies = [
"gio-sys",
"glib",
"libc",
"once_cell",
"pin-project-lite",
"smallvec",
"thiserror",
@ -2298,15 +2295,15 @@ dependencies = [
[[package]]
name = "gio-sys"
version = "0.18.1"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
checksum = "bcf8e1d9219bb294636753d307b030c1e8a032062cba74f493c431a5c8b81ce4"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
"winapi",
"windows-sys 0.52.0",
]
[[package]]
@ -2322,9 +2319,9 @@ dependencies = [
[[package]]
name = "glib"
version = "0.18.5"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
checksum = "170ee82b9b44b3b5fd1cf4971d6cf0eadec38303bb84c7bcc4e6b95a18934e71"
dependencies = [
"bitflags 2.4.2",
"futures-channel",
@ -2338,20 +2335,18 @@ dependencies = [
"gobject-sys",
"libc",
"memchr",
"once_cell",
"smallvec",
"thiserror",
]
[[package]]
name = "glib-macros"
version = "0.18.5"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
checksum = "2ff52fff7e4d1bb8598ae744e9bb90c8c76271712483c3f0ce931bee9814de85"
dependencies = [
"heck",
"proc-macro-crate 2.0.0",
"proc-macro-error",
"proc-macro-crate 3.1.0",
"proc-macro2",
"quote",
"syn 2.0.48",
@ -2359,9 +2354,9 @@ dependencies = [
[[package]]
name = "glib-sys"
version = "0.18.1"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
checksum = "630f097773d7c7a0bb3258df4e8157b47dc98bbfa0e60ad9ab56174813feced4"
dependencies = [
"libc",
"system-deps",
@ -2462,9 +2457,9 @@ dependencies = [
[[package]]
name = "gobject-sys"
version = "0.18.0"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
checksum = "c85e2b1080b9418dd0c58b498da3a5c826030343e0ef07bde6a955d28de54979"
dependencies = [
"glib-sys",
"libc",
@ -2473,9 +2468,9 @@ dependencies = [
[[package]]
name = "graphene-rs"
version = "0.18.1"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2228cda1505613a7a956cca69076892cfbda84fc2b7a62b94a41a272c0c401"
checksum = "147827e4f506f8073ac3ec5b28cc2255bdf3abc30f5b4e101a80506eebe11d2c"
dependencies = [
"glib",
"graphene-sys",
@ -2484,9 +2479,9 @@ dependencies = [
[[package]]
name = "graphene-sys"
version = "0.18.1"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc4144cee8fc8788f2a9b73dc5f1d4e1189d1f95305c4cb7bd9c1af1cfa31f59"
checksum = "236ed66cc9b18d8adf233716f75de803d0bf6fc806f60d14d948974a12e240d0"
dependencies = [
"glib-sys",
"libc",
@ -2496,9 +2491,9 @@ dependencies = [
[[package]]
name = "gsk4"
version = "0.7.3"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e"
checksum = "0e8ce8dee0fd87a11002214b1204ff18c9272fbd530408f0884a0f9b25dc31de"
dependencies = [
"cairo-rs",
"gdk4",
@ -2511,9 +2506,9 @@ dependencies = [
[[package]]
name = "gsk4-sys"
version = "0.7.3"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55"
checksum = "2660a652da5b662d43924df19ba40d73f015ed427329ef51d2b1360a4e0dc0e4"
dependencies = [
"cairo-sys-rs",
"gdk4-sys",
@ -2527,9 +2522,9 @@ dependencies = [
[[package]]
name = "gtk4"
version = "0.7.3"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842"
checksum = "7d26ffa3ec6316ccaa1df62d3e7f5bae1637c0acbb43f250fabef38319f73c64"
dependencies = [
"cairo-rs",
"field-offset",
@ -2548,12 +2543,12 @@ dependencies = [
[[package]]
name = "gtk4-macros"
version = "0.7.2"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f"
checksum = "c8b86439e9896f6f3f47c3d8077c5c8205174078760afdabd9098a8e9e937d97"
dependencies = [
"anyhow",
"proc-macro-crate 1.3.1",
"proc-macro-crate 3.1.0",
"proc-macro-error",
"proc-macro2",
"quote",
@ -2562,9 +2557,9 @@ dependencies = [
[[package]]
name = "gtk4-sys"
version = "0.7.3"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8"
checksum = "2abc0a6d356d59a3806021829ce6ed3e70bba3509b41a535fedcb09fae13fbc0"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@ -4072,22 +4067,21 @@ dependencies = [
[[package]]
name = "pango"
version = "0.18.3"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
checksum = "78d7f779b957728c74fd1a060dfa6d89a0bea792ebc50cc2da80e4e87282d69e"
dependencies = [
"gio",
"glib",
"libc",
"once_cell",
"pango-sys",
]
[[package]]
name = "pango-sys"
version = "0.18.0"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
checksum = "f52ef6a881c19fbfe3b1484df5cad411acaaba29dbec843941c3110d19f340ea"
dependencies = [
"glib-sys",
"gobject-sys",
@ -4364,15 +4358,6 @@ dependencies = [
"toml_edit 0.19.15",
]
[[package]]
name = "proc-macro-crate"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
dependencies = [
"toml_edit 0.20.7",
]
[[package]]
name = "proc-macro-crate"
version = "3.1.0"
@ -5796,17 +5781,6 @@ dependencies = [
"winnow",
]
[[package]]
name = "toml_edit"
version = "0.20.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
dependencies = [
"indexmap 2.2.2",
"toml_datetime",
"winnow",
]
[[package]]
name = "toml_edit"
version = "0.21.1"

View file

@ -10,9 +10,9 @@ homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
[dependencies]
gdk4 = "0.7"
glib = "0.18"
gtk4 = { version = "0.7", default-features = false, features = ["v4_6"] }
gdk4 = "0.8"
glib = "0.19"
gtk4 = { version = "0.8", default-features = false, features = ["v4_6"] }
humansize = "2.1"
chrono = "0.4.33"

View file

@ -1,10 +1,11 @@
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use std::time::Duration;
use chrono::NaiveDateTime;
use crossbeam_channel::Receiver;
use fun_time::fun_time;
use glib::Receiver;
use gtk4::prelude::*;
use gtk4::{Entry, ListStore, TextView, TreeView, Widget};
use humansize::{format_size, BINARY};
@ -35,7 +36,7 @@ use crate::notebook_enums::*;
use crate::notebook_info::NOTEBOOKS_INFO;
use crate::opening_selecting_records::*;
pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<Message>) {
pub fn connect_compute_results(gui_data: &GuiData, result_receiver: Receiver<Message>) {
let combo_box_image_hash_size = gui_data.main_notebook.combo_box_image_hash_size.clone();
let buttons_search = gui_data.bottom_buttons.buttons_search.clone();
let notebook_main = gui_data.main_notebook.notebook_main.clone();
@ -75,158 +76,166 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let main_context = glib::MainContext::default();
let _guard = main_context.acquire().unwrap();
glib_stop_receiver.attach(None, move |msg| {
buttons_search.show();
glib::spawn_future_local(async move {
loop {
loop {
let msg = result_receiver.try_recv();
if let Ok(msg) = msg {
buttons_search.show();
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
window_progress.hide();
window_progress.hide();
taskbar_state.borrow().hide();
taskbar_state.borrow().hide();
let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize;
let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index] as u8;
let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize;
let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index] as u8;
match msg {
Message::Duplicates(df) => {
computer_duplicate_finder(
df,
&entry_info,
&tree_view_duplicate_finder,
&text_view_errors,
&shared_duplication_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::EmptyFolders(ef) => {
computer_empty_folders(
ef,
&entry_info,
&tree_view_empty_folder_finder,
&text_view_errors,
&shared_empty_folders_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::EmptyFiles(vf) => {
computer_empty_files(
vf,
&entry_info,
&tree_view_empty_files_finder,
&text_view_errors,
&shared_empty_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::BigFiles(bf) => {
computer_big_files(
bf,
&entry_info,
&tree_view_big_files_finder,
&text_view_errors,
&shared_big_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::Temporary(tf) => {
computer_temporary_files(
tf,
&entry_info,
&tree_view_temporary_files_finder,
&text_view_errors,
&shared_temporary_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::SimilarImages(sf) => {
computer_similar_images(
sf,
&entry_info,
&tree_view_similar_images_finder,
&text_view_errors,
&shared_similar_images_state,
&shared_buttons,
&buttons_array,
&buttons_names,
hash_size,
);
}
Message::SimilarVideos(ff) => {
computer_similar_videos(
ff,
&entry_info,
&tree_view_similar_videos_finder,
&text_view_errors,
&shared_similar_videos_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::SameMusic(mf) => {
computer_same_music(
mf,
&entry_info,
&tree_view_same_music_finder,
&text_view_errors,
&shared_same_music_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::InvalidSymlinks(ifs) => {
computer_invalid_symlinks(
ifs,
&entry_info,
&tree_view_invalid_symlinks,
&text_view_errors,
&shared_same_invalid_symlinks,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::BrokenFiles(br) => {
computer_broken_files(
br,
&entry_info,
&tree_view_broken_files,
&text_view_errors,
&shared_broken_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::BadExtensions(be) => {
computer_bad_extensions(
be,
&entry_info,
&tree_view_bad_extensions,
&text_view_errors,
&shared_bad_extensions_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
match msg {
Message::Duplicates(df) => {
computer_duplicate_finder(
df,
&entry_info,
&tree_view_duplicate_finder,
&text_view_errors,
&shared_duplication_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::EmptyFolders(ef) => {
computer_empty_folders(
ef,
&entry_info,
&tree_view_empty_folder_finder,
&text_view_errors,
&shared_empty_folders_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::EmptyFiles(vf) => {
computer_empty_files(
vf,
&entry_info,
&tree_view_empty_files_finder,
&text_view_errors,
&shared_empty_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::BigFiles(bf) => {
computer_big_files(
bf,
&entry_info,
&tree_view_big_files_finder,
&text_view_errors,
&shared_big_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::Temporary(tf) => {
computer_temporary_files(
tf,
&entry_info,
&tree_view_temporary_files_finder,
&text_view_errors,
&shared_temporary_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::SimilarImages(sf) => {
computer_similar_images(
sf,
&entry_info,
&tree_view_similar_images_finder,
&text_view_errors,
&shared_similar_images_state,
&shared_buttons,
&buttons_array,
&buttons_names,
hash_size,
);
}
Message::SimilarVideos(ff) => {
computer_similar_videos(
ff,
&entry_info,
&tree_view_similar_videos_finder,
&text_view_errors,
&shared_similar_videos_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::SameMusic(mf) => {
computer_same_music(
mf,
&entry_info,
&tree_view_same_music_finder,
&text_view_errors,
&shared_same_music_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::InvalidSymlinks(ifs) => {
computer_invalid_symlinks(
ifs,
&entry_info,
&tree_view_invalid_symlinks,
&text_view_errors,
&shared_same_invalid_symlinks,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::BrokenFiles(br) => {
computer_broken_files(
br,
&entry_info,
&tree_view_broken_files,
&text_view_errors,
&shared_broken_files_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
Message::BadExtensions(be) => {
computer_bad_extensions(
be,
&entry_info,
&tree_view_bad_extensions,
&text_view_errors,
&shared_bad_extensions_state,
&shared_buttons,
&buttons_array,
&buttons_names,
);
}
}
} else {
break;
}
}
glib::timeout_future(Duration::from_millis(300)).await;
}
// Returning false here would close the receiver and have senders fail
glib::ControlFlow::Continue
});
}

View file

@ -5,7 +5,6 @@ use std::thread;
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use glib::Sender as glibSender;
use gtk4::prelude::*;
use gtk4::Grid;
@ -35,10 +34,10 @@ use crate::taskbar_progress::tbp_flags::TBPF_NOPROGRESS;
use crate::{flg, DEFAULT_MAXIMAL_FILE_SIZE, DEFAULT_MINIMAL_CACHE_SIZE, DEFAULT_MINIMAL_FILE_SIZE};
#[allow(clippy::too_many_arguments)]
pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: glibSender<Message>, progress_sender: Sender<ProgressData>) {
pub fn connect_button_search(gui_data: &GuiData, result_sender: Sender<Message>, progress_sender: Sender<ProgressData>) {
let buttons_array = gui_data.bottom_buttons.buttons_array.clone();
let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone();
let grid_progress_stages = gui_data.progress_window.grid_progress_stages.clone();
let grid_progress = gui_data.progress_window.grid_progress.clone();
let label_stage = gui_data.progress_window.label_stage.clone();
let notebook_main = gui_data.main_notebook.notebook_main.clone();
let notebook_upper = gui_data.upper_notebook.notebook_upper.clone();
@ -55,7 +54,7 @@ pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: glibSender<Me
let gui_data = gui_data.clone();
buttons_search_clone.connect_clicked(move |_| {
let loaded_common_items = LoadedCommonItems::load_items(&gui_data);
let loaded_commons = LoadedCommonItems::load_items(&gui_data);
// Check if user selected all referenced folders
let list_store_included_directories = get_list_store(&tree_view_included_directories);
@ -83,104 +82,27 @@ pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: glibSender<Me
reset_text_view(&text_view_errors);
let glib_stop_sender = glib_stop_sender.clone();
let result_sender = result_sender.clone();
let stop_receiver = stop_receiver.clone();
// Consume any stale stop messages.
stop_receiver.try_iter().for_each(|()| ());
label_stage.show();
let progress_sender = progress_sender.clone();
match to_notebook_main_enum(notebook_main.current_page().unwrap()) {
NotebookMainEnum::Duplicate => duplicate_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::EmptyFiles => empty_files_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::EmptyDirectories => empty_directories_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::BigFiles => big_files_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::Temporary => temporary_files_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::SimilarImages => similar_image_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::SimilarVideos => similar_video_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::SameMusic => same_music_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
&show_dialog,
),
NotebookMainEnum::Symlinks => bad_symlinks_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::BrokenFiles => broken_files_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
&show_dialog,
),
NotebookMainEnum::BadExtensions => bad_extensions_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
progress_sender.clone(),
),
NotebookMainEnum::Duplicate => duplicate_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::EmptyFiles => empty_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::EmptyDirectories => empty_dirs_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::BigFiles => big_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::Temporary => temporary_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::SimilarImages => similar_image_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::SimilarVideos => similar_video_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::SameMusic => same_music_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender, &show_dialog),
NotebookMainEnum::Symlinks => bad_symlinks_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
NotebookMainEnum::BrokenFiles => broken_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender, &show_dialog),
NotebookMainEnum::BadExtensions => bad_extensions_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
}
window_progress.set_default_size(1, 1);
@ -286,13 +208,13 @@ impl LoadedCommonItems {
fn duplicate_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.show();
grid_progress.show();
let combo_box_duplicate_check_method = gui_data.main_notebook.combo_box_duplicate_check_method.clone();
let combo_box_duplicate_hash_type = gui_data.main_notebook.combo_box_duplicate_hash_type.clone();
@ -325,30 +247,30 @@ fn duplicate_search(
.spawn(move || {
let mut item = DuplicateFinder::new();
set_common_settings(&mut item, &loaded_common_items);
item.set_minimal_cache_file_size(loaded_common_items.minimal_cache_file_size);
set_common_settings(&mut item, &loaded_commons);
item.set_minimal_cache_file_size(loaded_commons.minimal_cache_file_size);
item.set_minimal_prehash_cache_file_size(minimal_prehash_cache_file_size);
item.set_check_method(check_method);
item.set_hash_type(hash_type);
item.set_ignore_hard_links(loaded_common_items.hide_hard_links);
item.set_ignore_hard_links(loaded_commons.hide_hard_links);
item.set_use_prehash_cache(use_prehash_cache);
item.set_delete_outdated_cache(delete_outdated_cache);
item.set_case_sensitive_name_comparison(case_sensitive_name_comparison);
item.find_duplicates(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::Duplicates(item)).unwrap();
result_sender.send(Message::Duplicates(item)).unwrap();
})
.unwrap();
}
fn empty_files_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.hide();
grid_progress.hide();
let tree_view_empty_files_finder = gui_data.main_notebook.tree_view_empty_files_finder.clone();
clean_tree_view(&tree_view_empty_files_finder);
@ -358,22 +280,22 @@ fn empty_files_search(
.spawn(move || {
let mut item = EmptyFiles::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.find_empty_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::EmptyFiles(item)).unwrap();
result_sender.send(Message::EmptyFiles(item)).unwrap();
})
.unwrap();
}
fn empty_directories_search(
fn empty_dirs_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.hide();
grid_progress.hide();
let tree_view_empty_folder_finder = gui_data.main_notebook.tree_view_empty_folder_finder.clone();
clean_tree_view(&tree_view_empty_folder_finder);
@ -383,22 +305,22 @@ fn empty_directories_search(
.spawn(move || {
let mut item = EmptyFolder::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.find_empty_folders(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::EmptyFolders(item)).unwrap();
result_sender.send(Message::EmptyFolders(item)).unwrap();
})
.unwrap();
}
fn big_files_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.hide();
grid_progress.hide();
let combo_box_big_files_mode = gui_data.main_notebook.combo_box_big_files_mode.clone();
let entry_big_files_number = gui_data.main_notebook.entry_big_files_number.clone();
@ -415,24 +337,24 @@ fn big_files_search(
.spawn(move || {
let mut item = BigFile::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.set_number_of_files_to_check(numbers_of_files_to_check);
item.set_search_mode(big_files_mode);
item.find_big_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::BigFiles(item)).unwrap();
result_sender.send(Message::BigFiles(item)).unwrap();
})
.unwrap();
}
fn temporary_files_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.hide();
grid_progress.hide();
let tree_view_temporary_files_finder = gui_data.main_notebook.tree_view_temporary_files_finder.clone();
clean_tree_view(&tree_view_temporary_files_finder);
@ -442,23 +364,23 @@ fn temporary_files_search(
.spawn(move || {
let mut item = Temporary::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.find_temporary_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::Temporary(item)).unwrap();
result_sender.send(Message::Temporary(item)).unwrap();
})
.unwrap();
}
fn same_music_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
show_dialog: &Arc<AtomicBool>,
) {
grid_progress_stages.show();
grid_progress.show();
let check_button_music_artist: gtk4::CheckButton = gui_data.main_notebook.check_button_music_artist.clone();
let check_button_music_title: gtk4::CheckButton = gui_data.main_notebook.check_button_music_title.clone();
@ -509,14 +431,14 @@ fn same_music_search(
.spawn(move || {
let mut item = SameMusic::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.set_music_similarity(music_similarity);
item.set_maximum_difference(maximum_difference);
item.set_minimum_segment_duration(minimum_segment_duration);
item.set_check_type(check_method);
item.set_approximate_comparison(approximate_comparison);
item.find_same_music(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::SameMusic(item)).unwrap();
result_sender.send(Message::SameMusic(item)).unwrap();
})
.unwrap();
} else {
@ -546,14 +468,14 @@ fn same_music_search(
fn broken_files_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
show_dialog: &Arc<AtomicBool>,
) {
grid_progress_stages.show();
grid_progress.show();
let check_button_broken_files_archive: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_archive.clone();
let check_button_broken_files_pdf: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_pdf.clone();
@ -584,10 +506,10 @@ fn broken_files_search(
.spawn(move || {
let mut item = BrokenFiles::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.set_checked_types(checked_types);
item.find_broken_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::BrokenFiles(item)).unwrap();
result_sender.send(Message::BrokenFiles(item)).unwrap();
})
.unwrap();
} else {
@ -617,13 +539,13 @@ fn broken_files_search(
fn similar_image_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.show();
grid_progress.show();
let combo_box_image_hash_size = gui_data.main_notebook.combo_box_image_hash_size.clone();
let combo_box_image_hash_algorithm = gui_data.main_notebook.combo_box_image_hash_algorithm.clone();
@ -657,7 +579,7 @@ fn similar_image_search(
.spawn(move || {
let mut item = SimilarImages::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.set_similarity(similarity);
item.set_hash_alg(hash_alg);
item.set_hash_size(hash_size);
@ -665,20 +587,20 @@ fn similar_image_search(
item.set_delete_outdated_cache(delete_outdated_cache);
item.set_exclude_images_with_same_size(ignore_same_size);
item.find_similar_images(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::SimilarImages(item)).unwrap();
result_sender.send(Message::SimilarImages(item)).unwrap();
})
.unwrap();
}
fn similar_video_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.show();
grid_progress.show();
let check_button_video_ignore_same_size = gui_data.main_notebook.check_button_video_ignore_same_size.clone();
let check_button_settings_similar_videos_delete_outdated_cache = gui_data.settings.check_button_settings_similar_videos_delete_outdated_cache.clone();
@ -697,25 +619,25 @@ fn similar_video_search(
.spawn(move || {
let mut item = SimilarVideos::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.set_tolerance(tolerance);
item.set_delete_outdated_cache(delete_outdated_cache);
item.set_exclude_videos_with_same_size(ignore_same_size);
item.find_similar_videos(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::SimilarVideos(item)).unwrap();
result_sender.send(Message::SimilarVideos(item)).unwrap();
})
.unwrap();
}
fn bad_symlinks_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.hide();
grid_progress.hide();
let tree_view_invalid_symlinks = gui_data.main_notebook.tree_view_invalid_symlinks.clone();
clean_tree_view(&tree_view_invalid_symlinks);
@ -725,22 +647,22 @@ fn bad_symlinks_search(
.spawn(move || {
let mut item = InvalidSymlinks::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.find_invalid_links(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::InvalidSymlinks(item)).unwrap();
result_sender.send(Message::InvalidSymlinks(item)).unwrap();
})
.unwrap();
}
fn bad_extensions_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
loaded_commons: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: glibSender<Message>,
grid_progress_stages: &Grid,
result_sender: Sender<Message>,
grid_progress: &Grid,
progress_data_sender: Sender<ProgressData>,
) {
grid_progress_stages.show();
grid_progress.show();
let tree_view_bad_extensions = gui_data.main_notebook.tree_view_bad_extensions.clone();
clean_tree_view(&tree_view_bad_extensions);
@ -750,29 +672,29 @@ fn bad_extensions_search(
.spawn(move || {
let mut item = BadExtensions::new();
set_common_settings(&mut item, &loaded_common_items);
set_common_settings(&mut item, &loaded_commons);
item.find_bad_extensions_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::BadExtensions(item)).unwrap();
result_sender.send(Message::BadExtensions(item)).unwrap();
})
.unwrap();
}
fn set_common_settings<T>(component: &mut T, loaded_common_items: &LoadedCommonItems)
fn set_common_settings<T>(component: &mut T, loaded_commons: &LoadedCommonItems)
where
T: CommonData,
{
component.set_included_directory(loaded_common_items.included_directories.clone());
component.set_excluded_directory(loaded_common_items.excluded_directories.clone());
component.set_reference_directory(loaded_common_items.reference_directories.clone());
component.set_recursive_search(loaded_common_items.recursive_search);
component.set_allowed_extensions(loaded_common_items.allowed_extensions.clone());
component.set_excluded_extensions(loaded_common_items.excluded_extensions.clone());
component.set_excluded_items(loaded_common_items.excluded_items.clone());
component.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
component.set_use_cache(loaded_common_items.use_cache);
component.set_save_also_as_json(loaded_common_items.save_also_as_json);
component.set_minimal_file_size(loaded_common_items.minimal_file_size);
component.set_maximal_file_size(loaded_common_items.maximal_file_size);
component.set_included_directory(loaded_commons.included_directories.clone());
component.set_excluded_directory(loaded_commons.excluded_directories.clone());
component.set_reference_directory(loaded_commons.reference_directories.clone());
component.set_recursive_search(loaded_commons.recursive_search);
component.set_allowed_extensions(loaded_commons.allowed_extensions.clone());
component.set_excluded_extensions(loaded_commons.excluded_extensions.clone());
component.set_excluded_items(loaded_commons.excluded_items.clone());
component.set_exclude_other_filesystems(loaded_commons.ignore_other_filesystems);
component.set_use_cache(loaded_commons.use_cache);
component.set_save_also_as_json(loaded_commons.save_also_as_json);
component.set_minimal_file_size(loaded_commons.minimal_file_size);
component.set_maximal_file_size(loaded_commons.maximal_file_size);
}
#[fun_time(message = "clean_tree_view", level = "debug")]

View file

@ -15,7 +15,7 @@ pub struct GuiProgressDialog {
pub label_progress_current_stage: gtk4::Label,
pub label_progress_all_stages: gtk4::Label,
pub grid_progress_stages: gtk4::Grid,
pub grid_progress: gtk4::Grid,
pub button_stop_in_dialog: gtk4::Button,
pub evk_button_stop_in_dialog: EventControllerKey,
@ -38,7 +38,7 @@ impl GuiProgressDialog {
let label_progress_current_stage: gtk4::Label = builder.object("label_progress_current_stage").unwrap();
let label_progress_all_stages: gtk4::Label = builder.object("label_progress_all_stages").unwrap();
let grid_progress_stages: gtk4::Grid = builder.object("grid_progress_stages").unwrap();
let grid_progress: gtk4::Grid = builder.object("grid_progress").unwrap();
let button_stop_in_dialog: gtk4::Button = builder.object("button_stop_in_dialog").unwrap();
let evk_button_stop_in_dialog = EventControllerKey::new();
@ -53,7 +53,7 @@ impl GuiProgressDialog {
label_stage,
label_progress_current_stage,
label_progress_all_stages,
grid_progress_stages,
grid_progress,
button_stop_in_dialog,
evk_button_stop_in_dialog,
}

View file

@ -9,7 +9,6 @@ use std::env;
use std::ffi::OsString;
use crossbeam_channel::{unbounded, Receiver, Sender};
use glib::Priority;
use gtk4::gio::ApplicationFlags;
use gtk4::prelude::*;
use gtk4::Application;
@ -82,10 +81,7 @@ fn main() {
fn build_ui(application: &Application, arguments: &[OsString]) {
let gui_data: GuiData = GuiData::new_with_application(application);
// Used for getting data from thread
// TODO - deprecation happened without any example, so not sure how new code should look like
#[allow(deprecated)]
let (glib_stop_sender, glib_stop_receiver) = glib::MainContext::channel(Priority::default());
let (result_sender, result_receiver) = unbounded();
// Futures progress report
let (progress_sender, progress_receiver): (Sender<ProgressData>, Receiver<ProgressData>) = unbounded();
@ -111,7 +107,7 @@ fn build_ui(application: &Application, arguments: &[OsString]) {
connect_button_delete(&gui_data);
connect_button_save(&gui_data);
connect_button_search(&gui_data, glib_stop_sender, progress_sender);
connect_button_search(&gui_data, result_sender, progress_sender);
connect_button_select(&gui_data);
connect_button_sort(&gui_data);
connect_button_stop(&gui_data);
@ -124,7 +120,7 @@ fn build_ui(application: &Application, arguments: &[OsString]) {
connect_selection_of_directories(&gui_data);
connect_popover_select(&gui_data);
connect_popover_sort(&gui_data);
connect_compute_results(&gui_data, glib_stop_receiver);
connect_compute_results(&gui_data, result_receiver);
connect_progress_window(&gui_data, progress_receiver);
connect_show_hide_ui(&gui_data);
connect_settings(&gui_data);

View file

@ -267,7 +267,7 @@
(7,17,"GtkButton","buttons_popover_unselect_all",2,None,None,None,14,None),
(8,15,"GtkDialog","window_progress",None,None,None,None,None,None),
(8,16,"GtkBox",None,15,None,None,None,None,None),
(8,17,"GtkGrid","grid_progress_stages",16,None,None,None,None,None),
(8,17,"GtkGrid","grid_progress",16,None,None,None,None,None),
(8,18,"GtkLabel","label_progress_all_stages",17,None,None,None,None,None),
(8,19,"GtkProgressBar","progress_bar_all_stages",17,None,None,None,1,None),
(8,20,"GtkLabel","label_progress_current_stage",17,None,None,None,2,None),

View file

@ -13,7 +13,7 @@
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
<object class="GtkGrid" id="grid_progress_stages">
<object class="GtkGrid" id="grid_progress">
<property name="margin-end">2</property>
<property name="margin-start">2</property>
<property name="margin-top">2</property>