Skip to content

Commit

Permalink
Add option to exclude files from other filesystems in GUI(Linux) (#776)
Browse files Browse the repository at this point in the history
* Add exclude other fs to GUI

* Exclude in FS

* Fix crashes in gui and core

* More tests
  • Loading branch information
qarmin authored Jul 19, 2022
1 parent 07cfc78 commit 8f0527c
Show file tree
Hide file tree
Showing 33 changed files with 289 additions and 132 deletions.
136 changes: 69 additions & 67 deletions Cargo.lock

Large diffs are not rendered by default.

6 changes: 4 additions & 2 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
## Version 5.0.0 - ?.?.2022r
- GTK 4 port - [#466](https://github.com/qarmin/czkawka/pull/466)
- GUI ported to use GTK 4 - [#466](https://github.com/qarmin/czkawka/pull/466)
- Use multithreading and improved algorithm to compare image hashes - [#762](https://github.com/qarmin/czkawka/pull/762)
- Resize preview with window - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix removing only one item from list view - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix showing help command in duplicate CLI mode - [#720](https://github.com/qarmin/czkawka/pull/720)
- Fix freeze when not choosing any tag in similar music mode - [TODO]()
- Fix freeze when not choosing any tag in similar music mode - [#732](https://github.com/qarmin/czkawka/pull/732)
- Fix preview of files with non-lowercase extensions - [#694](https://github.com/qarmin/czkawka/pull/694)
- Read more tags from music files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Improve checking for invalid extensions - [#705](https://github.com/qarmin/czkawka/pull/705), [#747](https://github.com/qarmin/czkawka/pull/747), [#749](https://github.com/qarmin/czkawka/pull/749)
Expand All @@ -15,6 +16,7 @@
- Improve Windows CI - [#749](https://github.com/qarmin/czkawka/pull/749)
- Ability to check for broken files by types - [#749](https://github.com/qarmin/czkawka/pull/749)
- Add heif and Webp files support - [#750](https://github.com/qarmin/czkawka/pull/750)
- Use in CLI Clap library instead StructOpt - [#759](https://github.com/qarmin/czkawka/pull/759)

## Version 4.1.0 - 24.04.2022r
- New mode - finding files whose content not match with their extension - [#678](https://github.com/qarmin/czkawka/pull/678)
Expand Down
5 changes: 3 additions & 2 deletions czkawka_cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ name = "czkawka_cli"
version = "4.1.0"
authors = ["Rafał Mikrut <[email protected]>"]
edition = "2021"
rust-version = "1.60"
description = "CLI frontend of Czkawka"
license = "MIT"
homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"

[dependencies]
clap = { version = "3.2.3", features = ["derive"]}
clap = { version = "3.2.12", features = ["derive"] }

# For enum types
image_hasher = "1.0.0"
Expand All @@ -21,4 +22,4 @@ features = []

[features]
default = []
heif = ["czkawka_core/heif"]
heif = ["czkawka_core/heif"]
21 changes: 11 additions & 10 deletions czkawka_core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ name = "czkawka_core"
version = "4.1.0"
authors = ["Rafał Mikrut <[email protected]>"]
edition = "2021"
rust-version = "1.60"
description = "Core of Czkawka app"
license = "MIT"
homepage = "https://github.com/qarmin/czkawka"
Expand All @@ -11,27 +12,27 @@ repository = "https://github.com/qarmin/czkawka"

[dependencies]
humansize = "1.1.1"
rayon = "1.5.1"
crossbeam-channel = "0.5.4"
rayon = "1.5.3"
crossbeam-channel = "0.5.5"

# For saving/loading config files to specific directories
directories-next = "2.0.0"

# Needed by similar images
image_hasher = "1.0.0"
bk-tree = "0.4.0"
image = "0.24.2"
image = "0.24.3"
hamming = "0.1.3"

# Needed by same music
bitflags = "1.3.2"
lofty="0.7.0"
lofty= "0.7.2"

# Futures - needed by async progress sender
futures = "0.3.21"

# Needed by broken files
zip = { version = "0.6.2", features=["aes-crypto", "bzip2", "deflate", "time"], default-features = false}
zip = { version = "0.6.2", features = ["aes-crypto", "bzip2", "deflate", "time"], default-features = false }
audio_checker = "0.1.0"
pdf = "0.7.2"

Expand All @@ -47,15 +48,15 @@ vid_dup_finder_lib = "0.1.0"
ffmpeg_cmdline_utils = "0.1.1"

# Saving/Loading Cache
serde = "1.0.137"
serde = "1.0.139"
bincode = "1.3.3"
serde_json = "1.0.81"
serde_json = "1.0.82"

# Language
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"
rust-embed = "6.4.0"
once_cell = "1.10.0"
once_cell = "1.13.0"

# Raw image files
rawloader = "0.37.1"
Expand All @@ -68,8 +69,8 @@ infer = "0.9.0"
num_cpus = "1.13.1"

libheif-rs = { version = "0.15.0", optional = true }
anyhow = { version = "1.0.57", optional = true }
anyhow = { version = "1.0.58", optional = true }

[features]
default = []
heif = ["dep:libheif-rs", "dep:anyhow"]
heif = ["dep:libheif-rs", "dep:anyhow"]
6 changes: 6 additions & 0 deletions czkawka_core/src/bad_extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,12 @@ impl BadExtensions {
t => t,
};
}
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/big_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ impl BigFile {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

/// List of allowed extensions, only files with this extensions will be checking if are duplicates
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) {
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/broken_files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ impl BrokenFiles {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
Expand Down
4 changes: 2 additions & 2 deletions czkawka_core/src/common_directory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ pub struct Directories {
pub excluded_directories: Vec<PathBuf>,
pub included_directories: Vec<PathBuf>,
pub reference_directories: Vec<PathBuf>,
#[cfg(target_family = "unix")]
exclude_other_filesystems: Option<bool>,
#[cfg(target_family = "unix")]
included_dev_ids: Vec<u64>,
Expand Down Expand Up @@ -181,7 +180,8 @@ impl Directories {
self.reference_directories.dedup();

// Optimize for duplicated included directories - "/", "/home". "/home/Pulpit" to "/"
if recursive_search {
// Do not use when not using recursive search or using
if recursive_search && !self.exclude_other_filesystems.unwrap_or(false) {
// This is only point which can't be done when recursive search is disabled.
let mut is_inside: bool;
for ed_checked in &self.excluded_directories {
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/duplicate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@ impl DuplicateFinder {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) {
self.directories.set_included_directory(included_directory, &mut self.text_messages);
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/empty_files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ impl EmptyFiles {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/empty_folder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ impl EmptyFolder {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/invalid_symlinks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ impl InvalidSymlinks {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/same_music.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@ impl SameMusic {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

/// Set included dir which needs to be relative, exists etc.
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) {
Expand Down
5 changes: 4 additions & 1 deletion czkawka_core/src/similar_images.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@ impl SimilarImages {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_allowed_extensions(&mut self, allowed_extensions: String) {
self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages);
Expand Down Expand Up @@ -730,7 +732,8 @@ impl SimilarImages {
}

let number_of_processors = num_cpus::get();
let chunks: Vec<_> = all_hashes.chunks(all_hashes.len() / number_of_processors).collect();
let chunk_size = all_hashes.len() / number_of_processors;
let chunks: Vec<_> = if chunk_size > 0 { all_hashes.chunks(chunk_size).collect() } else { vec![&all_hashes] };

let parts: Vec<_> = chunks
.into_par_iter()
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/similar_videos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,8 @@ impl SimilarVideos {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_minimal_file_size(&mut self, minimal_file_size: u64) {
self.minimal_file_size = match minimal_file_size {
Expand Down
2 changes: 2 additions & 0 deletions czkawka_core/src/temporary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ impl Temporary {
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
pub fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}

pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
Expand Down
23 changes: 12 additions & 11 deletions czkawka_gui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@ name = "czkawka_gui"
version = "4.1.0"
authors = ["Rafał Mikrut <[email protected]>"]
edition = "2021"
rust-version = "1.60"
description = "GTK frontend of Czkawka"
license = "MIT"
homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"

[dependencies]
gdk4 = "0.4.7"
glib = "0.15.11"
gdk4 = "0.4.8"
glib = "0.15.12"

humansize = "1.1.1"
chrono = "0.4.19"

# Used for sending stop signal across threads
crossbeam-channel = "0.5.4"
crossbeam-channel = "0.5.5"

# To get informations about progress
futures = "0.3.21"
Expand All @@ -25,19 +26,19 @@ futures = "0.3.21"
directories-next = "2.0.0"

# For opening files
open = "3.0.1"
open = "3.0.2"

# To get image preview
image = "0.24.2"
image = "0.24.3"

# To be able to use custom select
regex = "1.5.5"
regex = "1.6.0"

# To get image_hasher types
image_hasher = "1.0.0"

# Move files to trash
trash = "2.1.4"
trash = "2.1.5"

# For moving files(why std::fs doesn't have such features)
fs_extra = "1.2.0"
Expand All @@ -46,14 +47,14 @@ fs_extra = "1.2.0"
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"
rust-embed = "6.4.0"
once_cell = "1.10.0"
once_cell = "1.13.0"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3.9", features = ["combaseapi", "objbase", "shobjidl_core", "windef", "winerror", "wtypesbase", "winuser"] }

[dependencies.gtk4]
version = "0.4.7"
default-features = false # just in case
version = "0.4.8"
default-features = false
features = ["v4_6"]

[dependencies.czkawka_core]
Expand All @@ -63,4 +64,4 @@ features = []

[features]
default = []
heif = ["czkawka_core/heif"]
heif = ["czkawka_core/heif"]
6 changes: 6 additions & 0 deletions czkawka_gui/i18n/en/czkawka_gui.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,12 @@ header_about_button_tooltip = Opens dialog with info about app.
# Settings
## General
settings_ignore_other_filesystems = Ignore other filesystems(only Linux)
settings_ignore_other_filesystems_tooltip =
ignores files that are not in the same file system as searched directories.
Works same like -xdev option in find command on Linux
settings_save_at_exit_button_tooltip = Save configuration to file when closing app.
settings_load_at_start_button_tooltip =
Load configuration from file when opening app.
Expand Down
12 changes: 7 additions & 5 deletions czkawka_gui/src/connect_things/connect_button_compare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ use image::DynamicImage;

use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::{count_number_of_groups, get_all_children, get_full_name_from_path_name, get_max_file_name, get_pixbuf_from_dynamic_image, resize_pixbuf_dimension};
use crate::help_functions::{
count_number_of_groups, get_all_direct_children, get_full_name_from_path_name, get_max_file_name, get_pixbuf_from_dynamic_image, resize_pixbuf_dimension,
};
use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_info::{NotebookObject, NOTEBOOKS_INFO};

Expand Down Expand Up @@ -326,7 +328,7 @@ fn populate_groups_at_start(
*shared_image_cache.borrow_mut() = cache_all_images.clone();

let mut found = false;
for i in get_all_children(&scrolled_window_compare_choose_images.child().unwrap().downcast::<gtk4::Viewport>().unwrap()) {
for i in get_all_direct_children(&scrolled_window_compare_choose_images.child().unwrap().downcast::<gtk4::Viewport>().unwrap()) {
if i.widget_name() == "all_box" {
let gtk_box = i.downcast::<gtk4::Box>().unwrap();
update_bottom_buttons(&gtk_box, shared_using_for_preview, shared_image_cache);
Expand Down Expand Up @@ -618,13 +620,13 @@ fn update_bottom_buttons(
let left_tree_view = (*shared_using_for_preview.borrow()).0.clone().unwrap();
let right_tree_view = (*shared_using_for_preview.borrow()).1.clone().unwrap();

for (number, i) in get_all_children(all_gtk_box).into_iter().enumerate() {
for (number, i) in get_all_direct_children(all_gtk_box).into_iter().enumerate() {
let cache_tree_path = (*image_cache.borrow())[number].4.clone();
let is_chosen = cache_tree_path != right_tree_view && cache_tree_path != left_tree_view;

let bx = i.downcast::<gtk4::Box>().unwrap();
let smaller_bx = get_all_children(&bx)[0].clone().downcast::<gtk4::Box>().unwrap();
for items in get_all_children(&smaller_bx) {
let smaller_bx = get_all_direct_children(&bx)[0].clone().downcast::<gtk4::Box>().unwrap();
for items in get_all_direct_children(&smaller_bx) {
if let Ok(btn) = items.downcast::<gtk4::Button>() {
btn.set_sensitive(is_chosen);
}
Expand Down
Loading

0 comments on commit 8f0527c

Please sign in to comment.