Reformat code with Intelij tool (#741)

This commit is contained in:
Rafał Mikrut 2022-05-31 17:52:55 +02:00 committed by GitHub
parent 5119a377c7
commit cf94ab918e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
48 changed files with 508 additions and 546 deletions

View File

@ -69,7 +69,7 @@ jobs:
- name: Install Homebrew
run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- name: Override link[WORKAROUND] # Looks that this is a bug with current homebrew or Github CI
- name: Override link[WORKAROUND] # Looks that this is a bug with current homebrew or GitHub CI
run: rm '/usr/local/bin/2to3'
- name: Install GTK4

View File

@ -56,7 +56,7 @@ jobs:
# Duplicate finder checks included and excluded directories
# Others are just check delete files number
# Windows build have some elements changed like powershell before wget and unzip, python instead python3, rm -r instead rm -r and one (at the top) additional test which check size of characyers
# Windows build have some elements changed like powershell before wget and unzip, python instead python3, rm -r instead rm -r and one (at the top) additional test which check size of characters
- name: test
run: |
powershell wget https://github.com/qarmin/czkawka/releases/download/1.1.0/TestSuite.zip -O TestSuite.zip

View File

@ -3,7 +3,7 @@
- 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 similiar music mode - [TODO]()
- Fix freeze when not choosing any tag in similar music mode - [TODO]()
- 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)
- Support for finding invalid PDF files - [#705](https://github.com/qarmin/czkawka/pull/705)
@ -38,7 +38,7 @@
- Change minimal supported OS to Ubuntu 20.04(needed by GTK) - [#468](https://github.com/qarmin/czkawka/pull/468)
- Increased performance by avoiding creating unnecessary image previews - [#468](https://github.com/qarmin/czkawka/pull/468)
- Improved performance due caching hash of broken/not supported images/videos = [#471](https://github.com/qarmin/czkawka/pull/471)
- Option to not remove cache from non existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472)
- Option to not remove cache from non-existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472)
- Add multiple tooltips with helpful messages - [#472](https://github.com/qarmin/czkawka/pull/472)
- Allow caching prehash - [#477](https://github.com/qarmin/czkawka/pull/477)
- Improve custom selecting of records(allows to use Rust regex) - [#489](https://github.com/qarmin/czkawka/pull/478)
@ -63,7 +63,7 @@
- Add additional info to printed errors [#446](https://github.com/qarmin/czkawka/pull/446)
- Add support for multiple image filters, hashes and sizes in similar images tool [#447](https://github.com/qarmin/czkawka/pull/447), [#448](https://github.com/qarmin/czkawka/pull/448)
- Button to move files/folders to provided location [#449](https://github.com/qarmin/czkawka/pull/449)
- Add non clickable button to fix white theme [#450](https://github.com/qarmin/czkawka/pull/450)
- Add non-clickable button to fix white theme [#450](https://github.com/qarmin/czkawka/pull/450)
- Fixed freeze when opening in same thread file/folder [#448](https://github.com/qarmin/czkawka/pull/448)
- Tool to check performance of different image filters and hash types and sizes [#447](https://github.com/qarmin/czkawka/pull/447)
- Add scheduled CI and pin it to support Rust 1.53.0 [7bb](https://github.com/qarmin/czkawka/commit/7bbdf742739a513b80d0cc06ba61dfafec976b23), [#431](https://github.com/qarmin/czkawka/pull/431)
@ -123,7 +123,7 @@
- Add support for CRC32 and XXH3 hash - [#243](https://github.com/qarmin/czkawka/pull/243)
- Add delete method to replace duplicate files with hard links - [#236](https://github.com/qarmin/czkawka/pull/236)
- Add checking for broken music opt-in - [#249](https://github.com/qarmin/czkawka/pull/249)
- Allow to save to files similar images results - [10156ccfd3](https://github.com/qarmin/czkawka/commit/10156ccfd3ba880d26d4bbad1e025b0050d7753b)
- Allow to save to file similar images results - [10156ccfd3](https://github.com/qarmin/czkawka/commit/10156ccfd3ba880d26d4bbad1e025b0050d7753b)
- Keep original file if replacing duplicate with hardlink fails - [#256](https://github.com/qarmin/czkawka/pull/256)
- Fix Windows theme - [#265](https://github.com/qarmin/czkawka/pull/265)
- Windows taskbar progress support - [#264](https://github.com/qarmin/czkawka/pull/264)
@ -169,7 +169,7 @@ This version is only needed to test flatpak build
- Add support for delete button - [#159](https://github.com/qarmin/czkawka/pull/159)
- Allow to select multiple entries in File Chooser - [#154](https://github.com/qarmin/czkawka/pull/154)
- Add cache support for similar images - [#139](https://github.com/qarmin/czkawka/pull/139)
- Add selecting images with it's size - [#138](https://github.com/qarmin/czkawka/pull/138)
- Add selecting images with its size - [#138](https://github.com/qarmin/czkawka/pull/138)
- Modernize popovers code and simplify later changes - [#137](https://github.com/qarmin/czkawka/pull/137)
## Version 2.0.0 - 23.12.2020r
@ -213,7 +213,7 @@ This version is only needed to test flatpak build
## Version 1.3.0 - 02.11.2020r
- Appimage support - [#77](https://github.com/qarmin/czkawka/pull/77)
- Removed warnings about non existend excluded directories - [#79](https://github.com/qarmin/czkawka/pull/79)
- Removed warnings about non-existed excluded directories - [#79](https://github.com/qarmin/czkawka/pull/79)
- Updated README - [8ec](https://github.com/qarmin/czkawka/commit/8ecde0fc9adb3e6cedf432c4ba749e698b645a7a)
- Added pre hash support(speedup for searching big duplicates) - [#83](https://github.com/qarmin/czkawka/pull/83)
- Support for searching duplicates by file name - [#84](https://github.com/qarmin/czkawka/pull/84)
@ -247,7 +247,7 @@ This version is only needed to test flatpak build
## Version 1.0.1 - 06.10.2020r
- Replaced default argument parser with StructOpt [#37](https://github.com/qarmin/czkawka/pull/37)
- Added all(except MacOS GTK build) builds to CI where can be freely downloaded [#41](https://github.com/qarmin/czkawka/pull/41) [#39](https://github.com/qarmin/czkawka/pull/39)
- Added all(except macOS GTK build) builds to CI where can be freely downloaded [#41](https://github.com/qarmin/czkawka/pull/41) [#39](https://github.com/qarmin/czkawka/pull/39)
- App can be downloaded also from Arch AUR and Cargo [#36](https://github.com/qarmin/czkawka/pull/36)
- Fixed crash with invalid file modification date [#33](https://github.com/qarmin/czkawka/issues/33)
- Upper tabs can hide and show when this is necessary [#38](https://github.com/qarmin/czkawka/pull/38)
@ -298,11 +298,11 @@ This version is only needed to test flatpak build
- Basic search in GTK
- Cleaned core from println
- Core functions doesn't use now process::exit(everything is done with help of messages/errors/warnings)
- Added support for non recursive search
- Added support for non-recursive search
- Improved finding number and size of duplicated files
- Saving results to file
- Print how much data was read by duplicate finder(debug only)
- Added Github CI
- Added GitHub CI
- Only debug build prints debug information's
- Clean code
- Add basic idea config to misc folder

View File

@ -3,7 +3,7 @@
**Czkawka** (_tch•kav•ka_ (IPA: [ʈ͡ʂkafka]), "hiccup" in Polish) is a simple, fast and free app to remove unnecessary files from your computer.
## UNSTABLE WARNING
**Currently master branch of this repository contains unstable GTK 4 port, so multiple regression, broken features etc. are expected.**
**Currently, master branch of this repository contains unstable GTK 4 port, so multiple regression, broken features etc. are expected.**
**You can use old stable version built with GTK 3 - [4.1.0](https://github.com/qarmin/czkawka/releases/tag/4.1.0) or compile app from git before GTK 4 PR merge.**
@ -50,7 +50,7 @@ If you want to try and develop Czkawka or just use the latest available feature,
Since Czkawka is written in Rust and it aims to be a faster alternative to FSlint or DupeGuru which are written in Python, we need to compare the speed of these tools.
I tested it on a 256 GB SSD and a i7-4770 CPU.
I tested it on a 256 GB SSD and an i7-4770 CPU.
I prepared a disk and performed a test without any folder exceptions and with disabled ignoring of hard links. The disk contained 363 215 files, took 221,8 GB and had 62093 duplicate files in 31790 groups which occupied 4,1 GB.
@ -135,7 +135,7 @@ There are many similar applications to Czkawka on the Internet, which do some th
### CLI
Due to limited time, the biggest emphasis is on the GUI version so if you are looking for really good and feature-packed console apps, then take a look at these:
- [Fclones](https://github.com/pkolaczk/fclones) - One of the fastest tools to find duplicates; it is written also in Rust
- [Rmlint](https://github.com/sahib/rmlint) - Really good console interface and also is feature packed
- [Rmlint](https://github.com/sahib/rmlint) - Nice console interface and also is feature packed
- [RdFind](https://github.com/pauldreik/rdfind) - Fast, but written in C++ ¯\\\_(ツ)\_/¯
## Contributions
@ -185,7 +185,7 @@ Big thanks to Pádraig Brady, creator of fantastic FSlint, because without his w
Thanks also to all the people who create patches for this program, make it available on other systems, create videos, articles about it etc.
Also I really appreciate work of people that create crates on which Czkawka is based and for that I try to report bugs to make it even better.
Also, I really appreciate work of people that create crates on which Czkawka is based and for that I try to report bugs to make it even better.
## Donations
If you are using the app, I would appreciate a donation for its further development, which can be done [here](https://github.com/sponsors/qarmin).

View File

@ -302,7 +302,7 @@ pub struct NotRecursive {
#[cfg(target_family = "unix")]
#[derive(Debug, StructOpt)]
pub struct ExcludeOtherFilesystems {
#[structopt(short = "X", long, help = "Exclude files on other filesystmes")]
#[structopt(short = "X", long, help = "Exclude files on other filesystems")]
pub exclude_other_filesystems: bool,
}

View File

@ -24,6 +24,7 @@ use czkawka_core::{
mod commands;
//noinspection ALL
fn main() {
let command = Commands::from_args();

View File

@ -104,7 +104,7 @@ static WORKAROUNDS: &[(&str, &str)] = &[
("xml", "xba"), // Libreoffice
("xml", "xcd"), // Libreoffice files
("zip", "apk"), // Android apk
("zip", "cbr"), // Komiksy
("zip", "cbr"), // Comics
("zip", "dat"), // Multiple - python, brave
("zip", "doc"), // Word
("zip", "docx"), // Word
@ -132,6 +132,7 @@ pub struct BadFileEntry {
pub current_extension: String,
pub proper_extensions: String,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {

View File

@ -403,7 +403,7 @@ impl DebugPrint for BigFile {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Number of files to check - {:?}", self.number_of_files_to_check);
println!("-----------------------------------------");
}

View File

@ -453,16 +453,16 @@ impl BrokenFiles {
Some(Some(file_entry_clone))
}
}
TypeOfFile::ArchiveZip => match fs::File::open(&file_entry.path) {
TypeOfFile::ArchiveZip => match File::open(&file_entry.path) {
Ok(file) => {
if let Err(e) = zip::ZipArchive::new(file) {
file_entry.error_string = e.to_string();
}
Some(Some(file_entry))
},
}
Err(_inspected) => Some(None)
},
TypeOfFile::Audio => match fs::File::open(&file_entry.path) {
TypeOfFile::Audio => match File::open(&file_entry.path) {
Ok(file) =>
{
let mut file_entry_clone = file_entry.clone();
@ -481,7 +481,7 @@ impl BrokenFiles {
file_entry_clone.error_string = "Audio crashes due parsing, please report bug here - https://github.com/qarmin/audio_checker/issues".to_string();
Some(Some(file_entry_clone))
}
},
}
Err(_inspected) => Some(None),
},
@ -502,7 +502,7 @@ impl BrokenFiles {
if let Err(e) = pdf::file::File::from_data(content) {
file_entry.error_string = e.to_string();
let error = unpack_pdf_error(e);
if let pdf::PdfError::InvalidPassword = error {
if let PdfError::InvalidPassword = error {
return Some(None);
}
}
@ -515,7 +515,7 @@ impl BrokenFiles {
file_entry_clone.error_string = "PDF-rs library crashed when opening pdf, and if it is not reported, please report bug here - https://github.com/pdf-rs/pdf".to_string();
Some(Some(file_entry_clone))
}
},
}
Err(_inspected) => Some(None)
}
}
@ -615,7 +615,7 @@ impl DebugPrint for BrokenFiles {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}

View File

@ -1,6 +1,3 @@
use directories_next::ProjectDirs;
use image::{DynamicImage, ImageBuffer, Rgb};
use imagepipe::{ImageSource, Pipeline};
use std::ffi::OsString;
use std::fs;
use std::fs::{File, OpenOptions};
@ -8,6 +5,10 @@ use std::io::BufReader;
use std::path::{Path, PathBuf};
use std::time::SystemTime;
use directories_next::ProjectDirs;
use image::{DynamicImage, ImageBuffer, Rgb};
use imagepipe::{ImageSource, Pipeline};
/// Class for common functions used across other class/functions
pub const RAW_IMAGE_EXTENSIONS: &[&str] = &[
".mrw", ".arw", ".srf", ".sr2", ".mef", ".orf", ".srw", ".erf", ".kdc", ".kdc", ".dcs", ".rw2", ".raf", ".dcr", ".dng", ".pef", ".crw", ".iiq", ".3fr", ".nrw", ".nef", ".mos",
@ -136,7 +137,7 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
};
// println!("Properly hashed {:?}", path);
Some(image::DynamicImage::ImageRgb8(image))
Some(DynamicImage::ImageRgb8(image))
}
impl Common {

View File

@ -7,10 +7,10 @@ use std::thread::sleep;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use std::{fs, thread};
use crate::common::LOOP_DURATION;
use crossbeam_channel::Receiver;
use rayon::prelude::*;
use crate::common::LOOP_DURATION;
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
@ -72,7 +72,8 @@ pub(crate) enum FolderEmptiness {
/// Struct assigned to each checked folder with parent path(used to ignore parent if children are not empty) and flag which shows if folder is empty
#[derive(Clone)]
pub struct FolderEntry {
pub(crate) parent_path: Option<PathBuf>, // Usable only when finding
pub(crate) parent_path: Option<PathBuf>,
// Usable only when finding
pub(crate) is_empty: FolderEmptiness,
pub modified_date: u64,
}

View File

@ -992,7 +992,7 @@ impl DebugPrint for DuplicateFinder {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Minimum file size - {:?}", self.minimal_file_size);
println!("Checking Method - {:?}", self.check_method);
println!("Delete Method - {:?}", self.delete_method);
@ -1306,6 +1306,7 @@ pub fn save_hashes_to_file(hashmap: &BTreeMap<String, FileEntry>, text_messages:
.push(flc!("core_saving_to_cache", generate_translation_hashmap(vec![("number", how_much.to_string())])));
}
}
pub fn load_hashes_from_file(text_messages: &mut Messages, delete_outdated_cache: bool, type_of_hash: &HashType, is_prehash: bool) -> Option<BTreeMap<u64, Vec<FileEntry>>> {
if let Some(((file_handler, cache_file), (_json_file, _json_name))) =
open_cache_folder(&get_file_hash_name(type_of_hash, is_prehash), false, false, &mut text_messages.warnings)

View File

@ -203,7 +203,7 @@ impl DebugPrint for EmptyFiles {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}

View File

@ -199,7 +199,7 @@ impl DebugPrint for InvalidSymlinks {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}

View File

@ -46,6 +46,7 @@ pub fn generate_translation_hashmap(vec: Vec<(&'static str, String)>) -> HashMap
pub fn fnc_get_similarity_very_high() -> String {
flc!("core_similarity_very_high")
}
pub fn fnc_get_similarity_minimal() -> String {
flc!("core_similarity_minimal")
}

View File

@ -708,10 +708,10 @@ impl SameMusic {
self.duplicated_music_entries = old_duplicates;
if self.use_reference_folders {
let mut similars_vector = Default::default();
mem::swap(&mut self.duplicated_music_entries, &mut similars_vector);
let mut similar_vector = Default::default();
mem::swap(&mut self.duplicated_music_entries, &mut similar_vector);
let reference_directories = self.directories.reference_directories.clone();
self.duplicated_music_entries_referenced = similars_vector
self.duplicated_music_entries_referenced = similar_vector
.into_iter()
.filter_map(|vec_file_entry| {
let mut files_from_referenced_folders = Vec::new();
@ -883,7 +883,7 @@ impl DebugPrint for SameMusic {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}

View File

@ -562,16 +562,13 @@ impl SimilarImages {
let image;
if !IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS.iter().any(|e| file_name_lowercase.ends_with(e)){
image = match get_dynamic_image_from_raw_image(&file_entry.path){
if !IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS.iter().any(|e| file_name_lowercase.ends_with(e)) {
image = match get_dynamic_image_from_raw_image(&file_entry.path) {
Some(t) => t,
None =>
return Some(Some((file_entry, Vec::new())))
return Some(Some((file_entry, Vec::new())))
};
}
else {
} else {
let result = panic::catch_unwind(|| {
match image::open(file_entry.path.clone()) {
Ok(t) => Ok(t),
@ -596,24 +593,22 @@ impl SimilarImages {
}
let dimensions = image.dimensions();
let dimensions = image.dimensions();
file_entry.dimensions = format!("{}x{}", dimensions.0, dimensions.1);
file_entry.dimensions = format!("{}x{}", dimensions.0, dimensions.1);
let hasher_config = HasherConfig::new()
.hash_size(self.hash_size as u32, self.hash_size as u32)
.hash_alg(self.hash_alg)
.resize_filter(self.image_filter);
let hasher = hasher_config.to_hasher();
let hasher_config = HasherConfig::new()
.hash_size(self.hash_size as u32, self.hash_size as u32)
.hash_alg(self.hash_alg)
.resize_filter(self.image_filter);
let hasher = hasher_config.to_hasher();
let hash = hasher.hash_image(&image);
let buf: Vec<u8> = hash.as_bytes().to_vec();
file_entry.hash = buf.clone();
Some(Some((file_entry, buf)))
let hash = hasher.hash_image(&image);
let buf: Vec<u8> = hash.as_bytes().to_vec();
file_entry.hash = buf.clone();
Some(Some((file_entry, buf)))
})
.while_some()
.filter(|file_entry| file_entry.is_some())
@ -887,10 +882,10 @@ impl SimilarImages {
}
if self.use_reference_folders {
let mut similars_vector = Default::default();
mem::swap(&mut self.similar_vectors, &mut similars_vector);
let mut similar_vector = Default::default();
mem::swap(&mut self.similar_vectors, &mut similar_vector);
let reference_directories = self.directories.reference_directories.clone();
self.similar_referenced_vectors = similars_vector
self.similar_referenced_vectors = similar_vector
.into_iter()
.filter_map(|vec_file_entry| {
let mut files_from_referenced_folders = Vec::new();

View File

@ -513,7 +513,7 @@ impl SimilarVideos {
return {
file_entry.error = format!("Failed to hash file, reason {}", e);
Some(file_entry)
}
};
}
};
@ -590,10 +590,10 @@ impl SimilarVideos {
self.similar_vectors = collected_similar_videos;
if self.use_reference_folders {
let mut similars_vector = Default::default();
mem::swap(&mut self.similar_vectors, &mut similars_vector);
let mut similar_vector = Default::default();
mem::swap(&mut self.similar_vectors, &mut similar_vector);
let reference_directories = self.directories.reference_directories.clone();
self.similar_referenced_vectors = similars_vector
self.similar_referenced_vectors = similar_vector
.into_iter()
.filter_map(|vec_file_entry| {
let mut files_from_referenced_folders = Vec::new();

View File

@ -377,7 +377,7 @@ impl DebugPrint for Temporary {
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Skip other filesystems - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}

View File

@ -9,6 +9,7 @@ use gtk4::prelude::*;
use humansize::{file_size_opts as options, FileSize};
use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::localizer_core::generate_translation_hashmap;
use czkawka_core::same_music::MusicSimilarity;
use czkawka_core::similar_images;
@ -18,7 +19,6 @@ use crate::help_combo_box::IMAGES_HASH_SIZE_COMBO_BOX;
use crate::help_functions::*;
use crate::notebook_enums::*;
use crate::opening_selecting_records::*;
use czkawka_core::localizer_core::generate_translation_hashmap;
pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<Message>) {
let combo_box_image_hash_size = gui_data.main_notebook.combo_box_image_hash_size.clone();
@ -1595,7 +1595,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
}
// Returning false here would close the receiver and have senders fail
glib::Continue(true)
Continue(true)
});
}

View File

@ -1,10 +1,11 @@
use crate::flg;
use gdk4::gdk_pixbuf::{InterpType, Pixbuf};
use gtk4::prelude::*;
use gtk4::{CheckButton, Image, ListStore, Orientation, ScrolledWindow, TreeIter, TreeModel, TreePath, TreeSelection, Widget};
use std::cell::RefCell;
use std::rc::Rc;
use gdk4::gdk_pixbuf::{InterpType, Pixbuf};
use gtk4::prelude::*;
use gtk4::{CheckButton, Image, ListStore, Orientation, ScrolledWindow, TreeIter, TreeModel, TreePath, TreeSelection, Widget};
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, resize_pixbuf_dimension, NotebookObject, NOTEBOOKS_INFOS};
use crate::localizer_core::generate_translation_hashmap;
@ -255,15 +256,15 @@ fn populate_groups_at_start(
model: &TreeModel,
shared_current_path: Rc<RefCell<Option<TreePath>>>,
tree_path: TreePath,
image_compare_left: &gtk4::Image,
image_compare_right: &gtk4::Image,
image_compare_left: &Image,
image_compare_right: &Image,
current_group: u32,
group_number: u32,
check_button_left_preview_text: &gtk4::CheckButton,
check_button_right_preview_text: &gtk4::CheckButton,
scrolled_window_compare_choose_images: &gtk4::ScrolledWindow,
check_button_left_preview_text: &CheckButton,
check_button_right_preview_text: &CheckButton,
scrolled_window_compare_choose_images: &ScrolledWindow,
label_group_info: &gtk4::Label,
shared_image_cache: Rc<RefCell<Vec<(String, String, gtk4::Image, gtk4::Image, gtk4::TreePath)>>>,
shared_image_cache: Rc<RefCell<Vec<(String, String, Image, Image, TreePath)>>>,
shared_using_for_preview: Rc<RefCell<(Option<TreePath>, Option<TreePath>)>>,
button_go_previous_compare_group: &gtk4::Button,
button_go_next_compare_group: &gtk4::Button,
@ -338,13 +339,13 @@ fn populate_groups_at_start(
}
/// Generate images which will be used later as preview images without needing to open them again and again
fn generate_cache_for_results(vector_with_path: Vec<(String, String, gtk4::TreePath)>) -> Vec<(String, String, gtk4::Image, gtk4::Image, gtk4::TreePath)> {
fn generate_cache_for_results(vector_with_path: Vec<(String, String, TreePath)>) -> Vec<(String, String, Image, Image, TreePath)> {
// TODO use here threads,
// For now threads cannot be used because Image and TreeIter cannot be used in threads
let mut cache_all_images = Vec::new();
for (full_path, name, tree_path) in vector_with_path {
let small_img = gtk4::Image::new();
let big_img = gtk4::Image::new();
let small_img = Image::new();
let big_img = Image::new();
match Pixbuf::from_file(&full_path) {
Ok(pixbuf) =>
@ -382,7 +383,7 @@ fn generate_cache_for_results(vector_with_path: Vec<(String, String, gtk4::TreeP
}
/// Takes info about current items in groups like path
fn get_all_path(model: &TreeModel, current_path: &TreePath, column_header: i32, column_path: i32, column_name: i32) -> Vec<(String, String, gtk4::TreePath)> {
fn get_all_path(model: &TreeModel, current_path: &TreePath, column_header: i32, column_path: i32, column_name: i32) -> Vec<(String, String, TreePath)> {
let used_iter = model.iter(current_path).unwrap();
assert!(model.get::<bool>(&used_iter, column_header));
@ -426,7 +427,7 @@ fn get_all_path(model: &TreeModel, current_path: &TreePath, column_header: i32,
}
/// Moves iterator to previous/next header
fn move_iter(model: &gtk4::TreeModel, tree_path: &TreePath, column_header: i32, go_next: bool) -> TreePath {
fn move_iter(model: &TreeModel, tree_path: &TreePath, column_header: i32, go_next: bool) -> TreePath {
let tree_iter = model.iter(tree_path).unwrap();
assert!(model.get::<bool>(&tree_iter, column_header));
@ -466,7 +467,7 @@ fn populate_similar_scrolled_view(
image_compare_left: &Image,
image_compare_right: &Image,
shared_using_for_preview: Rc<RefCell<(Option<TreePath>, Option<TreePath>)>>,
shared_image_cache: Rc<RefCell<Vec<(String, String, gtk4::Image, gtk4::Image, gtk4::TreePath)>>>,
shared_image_cache: Rc<RefCell<Vec<(String, String, Image, Image, TreePath)>>>,
check_button_left_preview_text: &CheckButton,
check_button_right_preview_text: &CheckButton,
model: &TreeModel,

View File

@ -6,7 +6,6 @@ use gtk4::prelude::*;
use gtk4::{Align, CheckButton, Dialog, Orientation, ResponseType, TextView};
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use crate::localizer_core::generate_translation_hashmap;
@ -115,7 +114,7 @@ pub async fn delete_things(gui_data: GuiData) {
}
pub async fn check_if_can_delete_files(
check_button_settings_confirm_deletion: &gtk4::CheckButton,
check_button_settings_confirm_deletion: &CheckButton,
window_main: &gtk4::Window,
number_of_selected_items: u64,
number_of_selected_groups: u64,
@ -140,7 +139,7 @@ pub async fn check_if_can_delete_files(
}
fn create_dialog_ask_for_deletion(window_main: &gtk4::Window, number_of_selected_items: u64, number_of_selected_groups: u64) -> (Dialog, CheckButton) {
let dialog = gtk4::Dialog::builder().title(&flg!("delete_title_dialog")).transient_for(window_main).modal(true).build();
let dialog = Dialog::builder().title(&flg!("delete_title_dialog")).transient_for(window_main).modal(true).build();
let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
@ -157,7 +156,7 @@ fn create_dialog_ask_for_deletion(window_main: &gtk4::Window, number_of_selected
generate_translation_hashmap(vec![("items", number_of_selected_items.to_string()), ("groups", number_of_selected_groups.to_string())])
))),
};
let check_button: gtk4::CheckButton = gtk4::CheckButton::with_label(&flg!("dialogs_ask_next_time"));
let check_button: CheckButton = CheckButton::with_label(&flg!("dialogs_ask_next_time"));
check_button.set_active(true);
check_button.set_halign(Align::Center);
@ -177,7 +176,7 @@ fn create_dialog_ask_for_deletion(window_main: &gtk4::Window, number_of_selected
}
fn create_dialog_group_deletion(window_main: &gtk4::Window) -> (Dialog, CheckButton) {
let dialog = gtk4::Dialog::builder()
let dialog = Dialog::builder()
.title(&flg!("delete_all_files_in_group_title"))
.transient_for(window_main)
.modal(true)
@ -187,7 +186,7 @@ fn create_dialog_group_deletion(window_main: &gtk4::Window) -> (Dialog, CheckBut
let label: gtk4::Label = gtk4::Label::new(Some(&flg!("delete_all_files_in_group_label1")));
let label2: gtk4::Label = gtk4::Label::new(Some(&flg!("delete_all_files_in_group_label2")));
let check_button: gtk4::CheckButton = gtk4::CheckButton::with_label(&flg!("dialogs_ask_next_time"));
let check_button: CheckButton = CheckButton::with_label(&flg!("dialogs_ask_next_time"));
check_button.set_active(true);
check_button.set_halign(Align::Center);
@ -209,7 +208,7 @@ pub async fn check_if_deleting_all_files_in_group(
column_selection: i32,
column_path: i32,
window_main: &gtk4::Window,
check_button_settings_confirm_group_deletion: &gtk4::CheckButton,
check_button_settings_confirm_group_deletion: &CheckButton,
) -> bool {
let model = get_list_store(tree_view);

View File

@ -4,9 +4,9 @@ use std::path::PathBuf;
use gtk4::prelude::*;
use gtk4::{Align, CheckButton, Dialog, Orientation, ResponseType, TextView, TreeIter, TreePath};
use crate::flg;
use czkawka_core::duplicate::make_hard_link;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use crate::localizer_core::generate_translation_hashmap;
@ -261,7 +261,7 @@ fn hardlink_symlink(
}
fn create_dialog_non_group(window_main: &gtk4::Window) -> Dialog {
let dialog = gtk4::Dialog::builder()
let dialog = Dialog::builder()
.title(&flg!("hard_sym_invalid_selection_title_dialog"))
.transient_for(window_main)
.modal(true)
@ -349,7 +349,7 @@ pub async fn check_if_anything_is_selected_async(tree_view: &gtk4::TreeView, col
false
}
pub async fn check_if_can_link_files(check_button_settings_confirm_link: &gtk4::CheckButton, window_main: &gtk4::Window) -> bool {
pub async fn check_if_can_link_files(check_button_settings_confirm_link: &CheckButton, window_main: &gtk4::Window) -> bool {
if check_button_settings_confirm_link.is_active() {
let (confirmation_dialog_link, check_button) = create_dialog_ask_for_linking(window_main);
@ -370,16 +370,12 @@ pub async fn check_if_can_link_files(check_button_settings_confirm_link: &gtk4::
}
fn create_dialog_ask_for_linking(window_main: &gtk4::Window) -> (Dialog, CheckButton) {
let dialog = gtk4::Dialog::builder()
.title(&flg!("hard_sym_link_title_dialog"))
.transient_for(window_main)
.modal(true)
.build();
let dialog = Dialog::builder().title(&flg!("hard_sym_link_title_dialog")).transient_for(window_main).modal(true).build();
let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label: gtk4::Label = gtk4::Label::new(Some(&flg!("hard_sym_link_label")));
let check_button: gtk4::CheckButton = gtk4::CheckButton::with_label(&flg!("dialogs_ask_next_time"));
let check_button: CheckButton = CheckButton::with_label(&flg!("dialogs_ask_next_time"));
check_button.set_active(true);
check_button.set_halign(Align::Center);

View File

@ -4,7 +4,6 @@ use gtk4::prelude::*;
use gtk4::{ResponseType, TreePath};
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use crate::localizer_core::generate_translation_hashmap;

View File

@ -5,9 +5,9 @@ use std::rc::Rc;
use gtk4::prelude::*;
use gtk4::{Button, Entry};
use crate::flg;
use czkawka_core::common_traits::SaveResults;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::BottomButtonsEnum;
use crate::localizer_core::generate_translation_hashmap;

View File

@ -1,9 +1,9 @@
use crossbeam_channel::{Sender, TrySendError};
use gtk4::prelude::*;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::KEY_ENTER;
use gtk4::prelude::*;
fn send_stop_message(stop_sender: &Sender<()>) {
stop_sender

View File

@ -13,15 +13,15 @@ use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE;
#[allow(clippy::too_many_arguments)]
pub fn connect_progress_window(
gui_data: &GuiData,
mut futures_receiver_duplicate_files: UnboundedReceiver<common_dir_traversal::ProgressData>,
mut futures_receiver_empty_files: UnboundedReceiver<common_dir_traversal::ProgressData>,
mut futures_receiver_empty_folder: UnboundedReceiver<common_dir_traversal::ProgressData>,
mut futures_receiver_duplicate_files: UnboundedReceiver<ProgressData>,
mut futures_receiver_empty_files: UnboundedReceiver<ProgressData>,
mut futures_receiver_empty_folder: UnboundedReceiver<ProgressData>,
mut futures_receiver_big_files: UnboundedReceiver<big_file::ProgressData>,
mut futures_receiver_same_music: UnboundedReceiver<common_dir_traversal::ProgressData>,
mut futures_receiver_same_music: UnboundedReceiver<ProgressData>,
mut futures_receiver_similar_images: UnboundedReceiver<similar_images::ProgressData>,
mut futures_receiver_similar_videos: UnboundedReceiver<similar_videos::ProgressData>,
mut futures_receiver_temporary: UnboundedReceiver<temporary::ProgressData>,
mut futures_receiver_invalid_symlinks: UnboundedReceiver<common_dir_traversal::ProgressData>,
mut futures_receiver_invalid_symlinks: UnboundedReceiver<ProgressData>,
mut futures_receiver_broken_files: UnboundedReceiver<broken_files::ProgressData>,
mut futures_receiver_bad_extensions: UnboundedReceiver<ProgressData>,
) {

View File

@ -3,10 +3,10 @@ use std::path::PathBuf;
use gtk4::prelude::*;
use gtk4::{Orientation, ResponseType, TreeView, Window};
use crate::flg;
#[cfg(target_family = "windows")]
use czkawka_core::common::Common;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::{get_list_store, ColumnsExcludedDirectory, ColumnsIncludedDirectory};

View File

@ -8,10 +8,10 @@ use gtk4::{ResponseType, Window};
use image::imageops::FilterType;
use image_hasher::HashAlg;
use crate::flg;
use czkawka_core::common_messages::Messages;
use czkawka_core::duplicate::HashType;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::get_dialog_box_child;
use crate::saving_loading::{load_configuration, reset_configuration, save_configuration};

View File

@ -1,21 +1,21 @@
use gtk4::prelude::*;
use gtk4::TreeViewColumn;
use gtk4::{CellRendererText, CellRendererToggle, TreeView, TreeViewColumn};
use crate::help_functions::*;
// When adding new column do not forget to update translations
pub fn create_tree_view_included_directories(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_included_directories(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.set_title("Folders to check");
column.pack_start(&renderer, true);
column.add_attribute(&renderer, "text", ColumnsIncludedDirectory::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsIncludedDirectory::ReferenceButton as i32);
@ -23,16 +23,16 @@ pub fn create_tree_view_included_directories(tree_view: &gtk4::TreeView) {
model.set_value(&iter, ColumnsIncludedDirectory::ReferenceButton as u32, &fixed.to_value());
});
renderer.set_activatable(true);
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.set_title("Reference folder");
column.pack_start(&renderer, true);
column.add_attribute(&renderer, "active", ColumnsIncludedDirectory::ReferenceButton as i32);
tree_view.append_column(&column);
}
pub fn create_tree_view_excluded_directories(tree_view: &gtk4::TreeView) {
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
pub fn create_tree_view_excluded_directories(tree_view: &TreeView) {
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.add_attribute(&renderer, "text", ColumnsExcludedDirectory::Path as i32);
tree_view.append_column(&column);
@ -40,17 +40,17 @@ pub fn create_tree_view_excluded_directories(tree_view: &gtk4::TreeView) {
tree_view.set_headers_visible(false);
}
pub fn create_tree_view_duplicates(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_duplicates(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsDuplicates::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsDuplicates::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
@ -59,8 +59,8 @@ pub fn create_tree_view_duplicates(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "cell-background", ColumnsDuplicates::Color as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Size");
column.set_resizable(true);
@ -70,8 +70,8 @@ pub fn create_tree_view_duplicates(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -81,8 +81,8 @@ pub fn create_tree_view_duplicates(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -92,8 +92,8 @@ pub fn create_tree_view_duplicates(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -106,25 +106,25 @@ pub fn create_tree_view_duplicates(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_empty_folders(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_empty_folders(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsEmptyFolders::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsEmptyFolders::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
column.add_attribute(&renderer, "active", ColumnsEmptyFolders::SelectionButton as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Folder Name");
column.set_resizable(true);
@ -133,8 +133,8 @@ pub fn create_tree_view_empty_folders(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsEmptyFolders::Name as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -143,8 +143,8 @@ pub fn create_tree_view_empty_folders(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsEmptyFolders::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -156,25 +156,25 @@ pub fn create_tree_view_empty_folders(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_big_files(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_big_files(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsBigFiles::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsBigFiles::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
column.add_attribute(&renderer, "active", ColumnsBigFiles::SelectionButton as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Size");
column.set_resizable(true);
@ -183,8 +183,8 @@ pub fn create_tree_view_big_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsBigFiles::SizeAsBytes as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -193,8 +193,8 @@ pub fn create_tree_view_big_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsBigFiles::Name as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -203,8 +203,8 @@ pub fn create_tree_view_big_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsBigFiles::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -216,25 +216,25 @@ pub fn create_tree_view_big_files(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_temporary_files(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_temporary_files(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsTemporaryFiles::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsTemporaryFiles::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
column.add_attribute(&renderer, "active", ColumnsTemporaryFiles::SelectionButton as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -243,8 +243,8 @@ pub fn create_tree_view_temporary_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsTemporaryFiles::Name as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -253,8 +253,8 @@ pub fn create_tree_view_temporary_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsTemporaryFiles::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -266,25 +266,25 @@ pub fn create_tree_view_temporary_files(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_empty_files(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_empty_files(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsEmptyFiles::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsEmptyFiles::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
column.add_attribute(&renderer, "active", ColumnsEmptyFiles::SelectionButton as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -293,8 +293,8 @@ pub fn create_tree_view_empty_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsEmptyFiles::Name as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -303,8 +303,8 @@ pub fn create_tree_view_empty_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsEmptyFiles::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -316,17 +316,17 @@ pub fn create_tree_view_empty_files(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_similar_images(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsSimilarImages::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsSimilarImages::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
@ -335,8 +335,8 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "cell-background", ColumnsSimilarImages::Color as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Similarity");
column.set_resizable(true);
@ -346,8 +346,8 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Size");
column.set_resizable(true);
@ -357,8 +357,8 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Dimensions");
column.set_resizable(true);
@ -368,8 +368,8 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -379,8 +379,8 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -390,8 +390,8 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -404,17 +404,17 @@ pub fn create_tree_view_similar_images(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_similar_videos(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_similar_videos(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsSimilarVideos::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsSimilarVideos::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
@ -423,8 +423,8 @@ pub fn create_tree_view_similar_videos(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "cell-background", ColumnsSimilarVideos::Color as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Size");
column.set_resizable(true);
@ -434,8 +434,8 @@ pub fn create_tree_view_similar_videos(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarVideos::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -445,8 +445,8 @@ pub fn create_tree_view_similar_videos(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarVideos::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -456,8 +456,8 @@ pub fn create_tree_view_similar_videos(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSimilarVideos::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -470,17 +470,17 @@ pub fn create_tree_view_similar_videos(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_same_music(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsSameMusic::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsSameMusic::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
@ -489,8 +489,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "cell-background", ColumnsSameMusic::Color as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Size");
column.set_resizable(true);
@ -500,8 +500,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("File Name");
column.set_resizable(true);
@ -511,8 +511,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Title");
column.set_resizable(true);
@ -522,8 +522,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Artist");
column.set_resizable(true);
@ -533,8 +533,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Year");
column.set_resizable(true);
@ -544,8 +544,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Bitrate");
column.set_resizable(true);
@ -555,8 +555,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Length");
column.set_resizable(true);
@ -566,8 +566,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Genre");
column.set_resizable(true);
@ -577,8 +577,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -588,8 +588,8 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -602,25 +602,25 @@ pub fn create_tree_view_same_music(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_invalid_symlinks(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_invalid_symlinks(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsInvalidSymlinks::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsInvalidSymlinks::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
column.add_attribute(&renderer, "active", ColumnsInvalidSymlinks::SelectionButton as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Symlink File Name");
column.set_resizable(true);
@ -629,8 +629,8 @@ pub fn create_tree_view_invalid_symlinks(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsInvalidSymlinks::Name as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Symlink Folder");
column.set_resizable(true);
@ -639,8 +639,8 @@ pub fn create_tree_view_invalid_symlinks(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsInvalidSymlinks::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Destination Path");
column.set_resizable(true);
@ -649,8 +649,8 @@ pub fn create_tree_view_invalid_symlinks(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsInvalidSymlinks::DestinationPath as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Type of Error");
column.set_resizable(true);
@ -659,8 +659,8 @@ pub fn create_tree_view_invalid_symlinks(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsInvalidSymlinks::TypeOfError as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);
@ -672,25 +672,25 @@ pub fn create_tree_view_invalid_symlinks(tree_view: &gtk4::TreeView) {
tree_view.set_vexpand(true);
}
pub fn create_tree_view_broken_files(tree_view: &gtk4::TreeView) {
pub fn create_tree_view_broken_files(tree_view: &TreeView) {
let model = get_list_store(tree_view);
let renderer = gtk4::CellRendererToggle::new();
let renderer = CellRendererToggle::new();
renderer.connect_toggled(move |_r, path| {
let iter = model.iter(&path).unwrap();
let mut fixed = model.get::<bool>(&iter, ColumnsBrokenFiles::SelectionButton as i32);
fixed = !fixed;
model.set_value(&iter, ColumnsBrokenFiles::SelectionButton as u32, &fixed.to_value());
});
let column = gtk4::TreeViewColumn::new();
let column = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_resizable(false);
column.set_fixed_width(30);
column.add_attribute(&renderer, "active", ColumnsBrokenFiles::SelectionButton as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Name");
column.set_resizable(true);
@ -699,8 +699,8 @@ pub fn create_tree_view_broken_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsBrokenFiles::Name as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Path");
column.set_resizable(true);
@ -709,8 +709,8 @@ pub fn create_tree_view_broken_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsBrokenFiles::Path as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("ErrorType");
column.set_resizable(true);
@ -719,8 +719,8 @@ pub fn create_tree_view_broken_files(tree_view: &gtk4::TreeView) {
column.set_sort_column_id(ColumnsBrokenFiles::ErrorType as i32);
tree_view.append_column(&column);
let renderer = gtk4::CellRendererText::new();
let column: gtk4::TreeViewColumn = TreeViewColumn::new();
let renderer = CellRendererText::new();
let column: TreeViewColumn = TreeViewColumn::new();
column.pack_start(&renderer, true);
column.set_title("Modification Date");
column.set_resizable(true);

View File

@ -9,10 +9,10 @@ use crate::help_functions::get_all_boxes_from_widget;
pub struct GuiAbout {
pub about_dialog: gtk4::AboutDialog,
pub button_repository: gtk4::Button,
pub button_donation: gtk4::Button,
pub button_instruction: gtk4::Button,
pub button_translation: gtk4::Button,
pub button_repository: Button,
pub button_donation: Button,
pub button_instruction: Button,
pub button_translation: Button,
}
impl GuiAbout {

View File

@ -23,7 +23,7 @@ pub struct GuiBottomButtons {
pub buttons_names: [BottomButtonsEnum; 8],
pub buttons_array: [Widget; 8],
pub gc_buttons_select: gtk4::GestureClick,
pub gc_buttons_select: GestureClick,
}
impl GuiBottomButtons {

View File

@ -1,10 +1,12 @@
use crate::help_functions::set_icon_of_button;
use crate::{flg, CZK_ICON_LEFT, CZK_ICON_RIGHT};
use gtk4::prelude::*;
use gtk4::{Builder, TreePath};
use std::cell::RefCell;
use std::rc::Rc;
use gtk4::prelude::*;
use gtk4::{Builder, TreePath};
use crate::help_functions::set_icon_of_button;
use crate::{flg, CZK_ICON_LEFT, CZK_ICON_RIGHT};
#[derive(Clone)]
pub struct GuiCompareImages {
pub window_compare: gtk4::Window,
@ -25,8 +27,8 @@ pub struct GuiCompareImages {
pub shared_numbers_of_groups: Rc<RefCell<u32>>,
pub shared_current_of_groups: Rc<RefCell<u32>>,
pub shared_current_path: Rc<RefCell<Option<TreePath>>>,
pub shared_image_cache: Rc<RefCell<Vec<(String, String, gtk4::Image, gtk4::Image, gtk4::TreePath)>>>,
pub shared_using_for_preview: Rc<RefCell<(Option<gtk4::TreePath>, Option<gtk4::TreePath>)>>,
pub shared_image_cache: Rc<RefCell<Vec<(String, String, gtk4::Image, gtk4::Image, TreePath)>>>,
pub shared_using_for_preview: Rc<RefCell<(Option<TreePath>, Option<TreePath>)>>,
}
impl GuiCompareImages {

View File

@ -3,12 +3,11 @@ use std::collections::HashMap;
use std::rc::Rc;
use crossbeam_channel::bounded;
use czkawka_core::bad_extensions::BadExtensions;
use gdk4::gdk_pixbuf::Pixbuf;
use gtk4::prelude::*;
use gtk4::Builder;
use crate::flg;
use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::duplicate::DuplicateFinder;
@ -20,6 +19,7 @@ use czkawka_core::similar_images::SimilarImages;
use czkawka_core::similar_videos::SimilarVideos;
use czkawka_core::temporary::Temporary;
use crate::flg;
use crate::gui_structs::gui_about::GuiAbout;
use crate::gui_structs::gui_bottom_buttons::GuiBottomButtons;
use crate::gui_structs::gui_compare_images::GuiCompareImages;

View File

@ -1,8 +1,8 @@
use gtk4::prelude::*;
use gtk4::{Builder, CheckButton, ComboBoxText, Entry, EventControllerKey, GestureClick, Image, Label, Notebook, Scale, ScrolledWindow, TreeView, Widget};
use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::localizer_core::{fnc_get_similarity_minimal, fnc_get_similarity_very_high};
use gtk4::prelude::*;
use gtk4::{EventControllerKey, GestureClick, TreeView};
use czkawka_core::similar_images::{get_string_from_similarity, Similarity, SIMILAR_VALUES};
use crate::flg;
@ -12,230 +12,230 @@ use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
#[derive(Clone)]
pub struct GuiMainNotebook {
pub notebook_main: gtk4::Notebook,
pub notebook_main: Notebook,
pub scrolled_window_duplicate_finder: gtk4::ScrolledWindow,
pub scrolled_window_empty_folder_finder: gtk4::ScrolledWindow,
pub scrolled_window_empty_files_finder: gtk4::ScrolledWindow,
pub scrolled_window_temporary_files_finder: gtk4::ScrolledWindow,
pub scrolled_window_big_files_finder: gtk4::ScrolledWindow,
pub scrolled_window_similar_images_finder: gtk4::ScrolledWindow,
pub scrolled_window_similar_videos_finder: gtk4::ScrolledWindow,
pub scrolled_window_same_music_finder: gtk4::ScrolledWindow,
pub scrolled_window_invalid_symlinks: gtk4::ScrolledWindow,
pub scrolled_window_broken_files: gtk4::ScrolledWindow,
pub scrolled_window_bad_extensions: gtk4::ScrolledWindow,
pub scrolled_window_duplicate_finder: ScrolledWindow,
pub scrolled_window_empty_folder_finder: ScrolledWindow,
pub scrolled_window_empty_files_finder: ScrolledWindow,
pub scrolled_window_temporary_files_finder: ScrolledWindow,
pub scrolled_window_big_files_finder: ScrolledWindow,
pub scrolled_window_similar_images_finder: ScrolledWindow,
pub scrolled_window_similar_videos_finder: ScrolledWindow,
pub scrolled_window_same_music_finder: ScrolledWindow,
pub scrolled_window_invalid_symlinks: ScrolledWindow,
pub scrolled_window_broken_files: ScrolledWindow,
pub scrolled_window_bad_extensions: ScrolledWindow,
pub tree_view_duplicate_finder: gtk4::TreeView,
pub tree_view_empty_folder_finder: gtk4::TreeView,
pub tree_view_empty_files_finder: gtk4::TreeView,
pub tree_view_temporary_files_finder: gtk4::TreeView,
pub tree_view_big_files_finder: gtk4::TreeView,
pub tree_view_similar_images_finder: gtk4::TreeView,
pub tree_view_similar_videos_finder: gtk4::TreeView,
pub tree_view_same_music_finder: gtk4::TreeView,
pub tree_view_invalid_symlinks: gtk4::TreeView,
pub tree_view_broken_files: gtk4::TreeView,
pub tree_view_bad_extensions: gtk4::TreeView,
pub tree_view_duplicate_finder: TreeView,
pub tree_view_empty_folder_finder: TreeView,
pub tree_view_empty_files_finder: TreeView,
pub tree_view_temporary_files_finder: TreeView,
pub tree_view_big_files_finder: TreeView,
pub tree_view_similar_images_finder: TreeView,
pub tree_view_similar_videos_finder: TreeView,
pub tree_view_same_music_finder: TreeView,
pub tree_view_invalid_symlinks: TreeView,
pub tree_view_broken_files: TreeView,
pub tree_view_bad_extensions: TreeView,
pub evk_tree_view_duplicate_finder: gtk4::EventControllerKey,
pub evk_tree_view_empty_folder_finder: gtk4::EventControllerKey,
pub evk_tree_view_empty_files_finder: gtk4::EventControllerKey,
pub evk_tree_view_temporary_files_finder: gtk4::EventControllerKey,
pub evk_tree_view_big_files_finder: gtk4::EventControllerKey,
pub evk_tree_view_similar_images_finder: gtk4::EventControllerKey,
pub evk_tree_view_similar_videos_finder: gtk4::EventControllerKey,
pub evk_tree_view_same_music_finder: gtk4::EventControllerKey,
pub evk_tree_view_invalid_symlinks: gtk4::EventControllerKey,
pub evk_tree_view_broken_files: gtk4::EventControllerKey,
pub evk_tree_view_bad_extensions: gtk4::EventControllerKey,
pub evk_tree_view_duplicate_finder: EventControllerKey,
pub evk_tree_view_empty_folder_finder: EventControllerKey,
pub evk_tree_view_empty_files_finder: EventControllerKey,
pub evk_tree_view_temporary_files_finder: EventControllerKey,
pub evk_tree_view_big_files_finder: EventControllerKey,
pub evk_tree_view_similar_images_finder: EventControllerKey,
pub evk_tree_view_similar_videos_finder: EventControllerKey,
pub evk_tree_view_same_music_finder: EventControllerKey,
pub evk_tree_view_invalid_symlinks: EventControllerKey,
pub evk_tree_view_broken_files: EventControllerKey,
pub evk_tree_view_bad_extensions: EventControllerKey,
pub gc_tree_view_duplicate_finder: gtk4::GestureClick,
pub gc_tree_view_empty_folder_finder: gtk4::GestureClick,
pub gc_tree_view_empty_files_finder: gtk4::GestureClick,
pub gc_tree_view_temporary_files_finder: gtk4::GestureClick,
pub gc_tree_view_big_files_finder: gtk4::GestureClick,
pub gc_tree_view_similar_images_finder: gtk4::GestureClick,
pub gc_tree_view_similar_videos_finder: gtk4::GestureClick,
pub gc_tree_view_same_music_finder: gtk4::GestureClick,
pub gc_tree_view_invalid_symlinks: gtk4::GestureClick,
pub gc_tree_view_broken_files: gtk4::GestureClick,
pub gc_tree_view_bad_extensions: gtk4::GestureClick,
pub gc_tree_view_duplicate_finder: GestureClick,
pub gc_tree_view_empty_folder_finder: GestureClick,
pub gc_tree_view_empty_files_finder: GestureClick,
pub gc_tree_view_temporary_files_finder: GestureClick,
pub gc_tree_view_big_files_finder: GestureClick,
pub gc_tree_view_similar_images_finder: GestureClick,
pub gc_tree_view_similar_videos_finder: GestureClick,
pub gc_tree_view_same_music_finder: GestureClick,
pub gc_tree_view_invalid_symlinks: GestureClick,
pub gc_tree_view_broken_files: GestureClick,
pub gc_tree_view_bad_extensions: GestureClick,
// General
// Duplicate
pub combo_box_duplicate_check_method: gtk4::ComboBoxText,
pub combo_box_duplicate_hash_type: gtk4::ComboBoxText,
pub label_duplicate_check_method: gtk4::Label,
pub label_duplicate_hash_type: gtk4::Label,
pub check_button_duplicate_case_sensitive_name: gtk4::CheckButton,
pub combo_box_duplicate_check_method: ComboBoxText,
pub combo_box_duplicate_hash_type: ComboBoxText,
pub label_duplicate_check_method: Label,
pub label_duplicate_hash_type: Label,
pub check_button_duplicate_case_sensitive_name: CheckButton,
pub image_preview_duplicates: gtk4::Image,
pub image_preview_duplicates: Image,
// Big file
pub label_big_shown_files: gtk4::Label,
pub entry_big_files_number: gtk4::Entry,
pub label_big_shown_files: Label,
pub entry_big_files_number: Entry,
// Similar Images
pub scale_similarity_similar_images: gtk4::Scale,
pub scale_similarity_similar_images: Scale,
pub label_image_resize_algorithm: gtk4::Label,
pub label_image_hash_type: gtk4::Label,
pub label_image_hash_size: gtk4::Label,
pub label_image_resize_algorithm: Label,
pub label_image_hash_type: Label,
pub label_image_hash_size: Label,
pub combo_box_image_resize_algorithm: gtk4::ComboBoxText,
pub combo_box_image_hash_algorithm: gtk4::ComboBoxText,
pub combo_box_image_hash_size: gtk4::ComboBoxText,
pub combo_box_image_resize_algorithm: ComboBoxText,
pub combo_box_image_hash_algorithm: ComboBoxText,
pub combo_box_image_hash_size: ComboBoxText,
pub check_button_image_ignore_same_size: gtk4::CheckButton,
pub check_button_video_ignore_same_size: gtk4::CheckButton,
pub check_button_image_ignore_same_size: CheckButton,
pub check_button_video_ignore_same_size: CheckButton,
pub check_button_image_fast_compare: gtk4::CheckButton,
pub check_button_image_fast_compare: CheckButton,
pub label_image_similarity: gtk4::Label,
pub label_image_similarity_max: gtk4::Label,
pub label_image_similarity: Label,
pub label_image_similarity_max: Label,
pub image_preview_similar_images: gtk4::Image,
pub label_similar_images_minimal_similarity: gtk4::Label,
pub image_preview_similar_images: Image,
pub label_similar_images_minimal_similarity: Label,
// Video
pub label_video_similarity: gtk4::Label,
pub label_video_similarity_min: gtk4::Label,
pub label_video_similarity_max: gtk4::Label,
pub label_video_similarity: Label,
pub label_video_similarity_min: Label,
pub label_video_similarity_max: Label,
pub scale_similarity_similar_videos: gtk4::Scale,
pub scale_similarity_similar_videos: Scale,
// Music
pub check_button_music_title: gtk4::CheckButton,
pub check_button_music_artist: gtk4::CheckButton,
pub check_button_music_year: gtk4::CheckButton,
pub check_button_music_bitrate: gtk4::CheckButton,
pub check_button_music_genre: gtk4::CheckButton,
pub check_button_music_length: gtk4::CheckButton,
pub check_button_music_approximate_comparison: gtk4::CheckButton,
pub check_button_music_title: CheckButton,
pub check_button_music_artist: CheckButton,
pub check_button_music_year: CheckButton,
pub check_button_music_bitrate: CheckButton,
pub check_button_music_genre: CheckButton,
pub check_button_music_length: CheckButton,
pub check_button_music_approximate_comparison: CheckButton,
}
impl GuiMainNotebook {
pub fn create_from_builder(builder: &gtk4::Builder) -> Self {
let notebook_main: gtk4::Notebook = builder.object("notebook_main").unwrap();
pub fn create_from_builder(builder: &Builder) -> Self {
let notebook_main: Notebook = builder.object("notebook_main").unwrap();
let scrolled_window_duplicate_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_duplicate_finder").unwrap();
let scrolled_window_empty_folder_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_empty_folder_finder").unwrap();
let scrolled_window_empty_files_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_empty_files_finder").unwrap();
let scrolled_window_temporary_files_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_temporary_files_finder").unwrap();
let scrolled_window_big_files_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_big_files_finder").unwrap();
let scrolled_window_similar_images_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_similar_images_finder").unwrap();
let scrolled_window_similar_videos_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_similar_videos_finder").unwrap();
let scrolled_window_same_music_finder: gtk4::ScrolledWindow = builder.object("scrolled_window_same_music_finder").unwrap();
let scrolled_window_invalid_symlinks: gtk4::ScrolledWindow = builder.object("scrolled_window_invalid_symlinks").unwrap();
let scrolled_window_broken_files: gtk4::ScrolledWindow = builder.object("scrolled_window_broken_files").unwrap();
let scrolled_window_bad_extensions: gtk4::ScrolledWindow = builder.object("scrolled_window_bad_extensions").unwrap();
let scrolled_window_duplicate_finder: ScrolledWindow = builder.object("scrolled_window_duplicate_finder").unwrap();
let scrolled_window_empty_folder_finder: ScrolledWindow = builder.object("scrolled_window_empty_folder_finder").unwrap();
let scrolled_window_empty_files_finder: ScrolledWindow = builder.object("scrolled_window_empty_files_finder").unwrap();
let scrolled_window_temporary_files_finder: ScrolledWindow = builder.object("scrolled_window_temporary_files_finder").unwrap();
let scrolled_window_big_files_finder: ScrolledWindow = builder.object("scrolled_window_big_files_finder").unwrap();
let scrolled_window_similar_images_finder: ScrolledWindow = builder.object("scrolled_window_similar_images_finder").unwrap();
let scrolled_window_similar_videos_finder: ScrolledWindow = builder.object("scrolled_window_similar_videos_finder").unwrap();
let scrolled_window_same_music_finder: ScrolledWindow = builder.object("scrolled_window_same_music_finder").unwrap();
let scrolled_window_invalid_symlinks: ScrolledWindow = builder.object("scrolled_window_invalid_symlinks").unwrap();
let scrolled_window_broken_files: ScrolledWindow = builder.object("scrolled_window_broken_files").unwrap();
let scrolled_window_bad_extensions: ScrolledWindow = builder.object("scrolled_window_bad_extensions").unwrap();
let tree_view_duplicate_finder: gtk4::TreeView = TreeView::new();
let tree_view_duplicate_finder: TreeView = TreeView::new();
tree_view_duplicate_finder.set_widget_name("PIERD");
let tree_view_empty_folder_finder: gtk4::TreeView = TreeView::new();
let tree_view_empty_files_finder: gtk4::TreeView = TreeView::new();
let tree_view_temporary_files_finder: gtk4::TreeView = TreeView::new();
let tree_view_big_files_finder: gtk4::TreeView = TreeView::new();
let tree_view_similar_images_finder: gtk4::TreeView = TreeView::new();
let tree_view_similar_videos_finder: gtk4::TreeView = TreeView::new();
let tree_view_same_music_finder: gtk4::TreeView = TreeView::new();
let tree_view_invalid_symlinks: gtk4::TreeView = TreeView::new();
let tree_view_broken_files: gtk4::TreeView = TreeView::new();
let tree_view_bad_extensions: gtk4::TreeView = TreeView::new();
let tree_view_empty_folder_finder: TreeView = TreeView::new();
let tree_view_empty_files_finder: TreeView = TreeView::new();
let tree_view_temporary_files_finder: TreeView = TreeView::new();
let tree_view_big_files_finder: TreeView = TreeView::new();
let tree_view_similar_images_finder: TreeView = TreeView::new();
let tree_view_similar_videos_finder: TreeView = TreeView::new();
let tree_view_same_music_finder: TreeView = TreeView::new();
let tree_view_invalid_symlinks: TreeView = TreeView::new();
let tree_view_broken_files: TreeView = TreeView::new();
let tree_view_bad_extensions: TreeView = TreeView::new();
let evk_tree_view_duplicate_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_duplicate_finder: EventControllerKey = EventControllerKey::new();
tree_view_duplicate_finder.add_controller(&evk_tree_view_duplicate_finder);
let evk_tree_view_empty_folder_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_empty_folder_finder: EventControllerKey = EventControllerKey::new();
tree_view_empty_folder_finder.add_controller(&evk_tree_view_empty_folder_finder);
let evk_tree_view_empty_files_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_empty_files_finder: EventControllerKey = EventControllerKey::new();
tree_view_empty_files_finder.add_controller(&evk_tree_view_empty_files_finder);
let evk_tree_view_temporary_files_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_temporary_files_finder: EventControllerKey = EventControllerKey::new();
tree_view_temporary_files_finder.add_controller(&evk_tree_view_temporary_files_finder);
let evk_tree_view_big_files_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_big_files_finder: EventControllerKey = EventControllerKey::new();
tree_view_big_files_finder.add_controller(&evk_tree_view_big_files_finder);
let evk_tree_view_similar_images_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_similar_images_finder: EventControllerKey = EventControllerKey::new();
tree_view_similar_images_finder.add_controller(&evk_tree_view_similar_images_finder);
let evk_tree_view_similar_videos_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_similar_videos_finder: EventControllerKey = EventControllerKey::new();
tree_view_similar_videos_finder.add_controller(&evk_tree_view_similar_videos_finder);
let evk_tree_view_same_music_finder: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_same_music_finder: EventControllerKey = EventControllerKey::new();
tree_view_same_music_finder.add_controller(&evk_tree_view_same_music_finder);
let evk_tree_view_invalid_symlinks: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_invalid_symlinks: EventControllerKey = EventControllerKey::new();
tree_view_invalid_symlinks.add_controller(&evk_tree_view_invalid_symlinks);
let evk_tree_view_broken_files: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_broken_files: EventControllerKey = EventControllerKey::new();
tree_view_broken_files.add_controller(&evk_tree_view_broken_files);
let evk_tree_view_bad_extensions: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_bad_extensions: EventControllerKey = EventControllerKey::new();
tree_view_bad_extensions.add_controller(&evk_tree_view_bad_extensions);
let gc_tree_view_duplicate_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_duplicate_finder: GestureClick = GestureClick::new();
tree_view_duplicate_finder.add_controller(&gc_tree_view_duplicate_finder);
let gc_tree_view_empty_folder_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_empty_folder_finder: GestureClick = GestureClick::new();
tree_view_empty_folder_finder.add_controller(&gc_tree_view_empty_folder_finder);
let gc_tree_view_empty_files_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_empty_files_finder: GestureClick = GestureClick::new();
tree_view_empty_files_finder.add_controller(&gc_tree_view_empty_files_finder);
let gc_tree_view_temporary_files_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_temporary_files_finder: GestureClick = GestureClick::new();
tree_view_temporary_files_finder.add_controller(&gc_tree_view_temporary_files_finder);
let gc_tree_view_big_files_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_big_files_finder: GestureClick = GestureClick::new();
tree_view_big_files_finder.add_controller(&gc_tree_view_big_files_finder);
let gc_tree_view_similar_images_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_similar_images_finder: GestureClick = GestureClick::new();
tree_view_similar_images_finder.add_controller(&gc_tree_view_similar_images_finder);
let gc_tree_view_similar_videos_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_similar_videos_finder: GestureClick = GestureClick::new();
tree_view_similar_videos_finder.add_controller(&gc_tree_view_similar_videos_finder);
let gc_tree_view_same_music_finder: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_same_music_finder: GestureClick = GestureClick::new();
tree_view_same_music_finder.add_controller(&gc_tree_view_same_music_finder);
let gc_tree_view_invalid_symlinks: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_invalid_symlinks: GestureClick = GestureClick::new();
tree_view_invalid_symlinks.add_controller(&gc_tree_view_invalid_symlinks);
let gc_tree_view_broken_files: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_broken_files: GestureClick = GestureClick::new();
tree_view_broken_files.add_controller(&gc_tree_view_broken_files);
let gc_tree_view_bad_extensions: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_bad_extensions: GestureClick = GestureClick::new();
tree_view_bad_extensions.add_controller(&gc_tree_view_bad_extensions);
let combo_box_duplicate_check_method: gtk4::ComboBoxText = builder.object("combo_box_duplicate_check_method").unwrap();
let combo_box_duplicate_hash_type: gtk4::ComboBoxText = builder.object("combo_box_duplicate_hash_type").unwrap();
let combo_box_duplicate_check_method: ComboBoxText = builder.object("combo_box_duplicate_check_method").unwrap();
let combo_box_duplicate_hash_type: ComboBoxText = builder.object("combo_box_duplicate_hash_type").unwrap();
let entry_big_files_number: gtk4::Entry = builder.object("entry_big_files_number").unwrap();
let entry_big_files_number: Entry = builder.object("entry_big_files_number").unwrap();
//// Check Buttons
let check_button_duplicate_case_sensitive_name: gtk4::CheckButton = builder.object("check_button_duplicate_case_sensitive_name").unwrap();
let check_button_music_title: gtk4::CheckButton = builder.object("check_button_music_title").unwrap();
let check_button_music_artist: gtk4::CheckButton = builder.object("check_button_music_artist").unwrap();
let check_button_music_year: gtk4::CheckButton = builder.object("check_button_music_year").unwrap();
let check_button_music_bitrate: gtk4::CheckButton = builder.object("check_button_music_bitrate").unwrap();
let check_button_music_genre: gtk4::CheckButton = builder.object("check_button_music_genre").unwrap();
let check_button_music_length: gtk4::CheckButton = builder.object("check_button_music_length").unwrap();
let check_button_music_approximate_comparison: gtk4::CheckButton = builder.object("check_button_music_approximate_comparison").unwrap();
let check_button_duplicate_case_sensitive_name: CheckButton = builder.object("check_button_duplicate_case_sensitive_name").unwrap();
let check_button_music_title: CheckButton = builder.object("check_button_music_title").unwrap();
let check_button_music_artist: CheckButton = builder.object("check_button_music_artist").unwrap();
let check_button_music_year: CheckButton = builder.object("check_button_music_year").unwrap();
let check_button_music_bitrate: CheckButton = builder.object("check_button_music_bitrate").unwrap();
let check_button_music_genre: CheckButton = builder.object("check_button_music_genre").unwrap();
let check_button_music_length: CheckButton = builder.object("check_button_music_length").unwrap();
let check_button_music_approximate_comparison: CheckButton = builder.object("check_button_music_approximate_comparison").unwrap();
//// Radio Buttons
let scale_similarity_similar_images: gtk4::Scale = builder.object("scale_similarity_similar_images").unwrap();
let scale_similarity_similar_videos: gtk4::Scale = builder.object("scale_similarity_similar_videos").unwrap();
let scale_similarity_similar_images: Scale = builder.object("scale_similarity_similar_images").unwrap();
let scale_similarity_similar_videos: Scale = builder.object("scale_similarity_similar_videos").unwrap();
let check_button_image_fast_compare: gtk4::CheckButton = builder.object("check_button_image_fast_compare").unwrap();
let check_button_image_fast_compare: CheckButton = builder.object("check_button_image_fast_compare").unwrap();
let combo_box_image_resize_algorithm: gtk4::ComboBoxText = builder.object("combo_box_image_resize_algorithm").unwrap();
let combo_box_image_hash_algorithm: gtk4::ComboBoxText = builder.object("combo_box_image_hash_algorithm").unwrap();
let combo_box_image_hash_size: gtk4::ComboBoxText = builder.object("combo_box_image_hash_size").unwrap();
let combo_box_image_resize_algorithm: ComboBoxText = builder.object("combo_box_image_resize_algorithm").unwrap();
let combo_box_image_hash_algorithm: ComboBoxText = builder.object("combo_box_image_hash_algorithm").unwrap();
let combo_box_image_hash_size: ComboBoxText = builder.object("combo_box_image_hash_size").unwrap();
let check_button_image_ignore_same_size: gtk4::CheckButton = builder.object("check_button_image_ignore_same_size").unwrap();
let check_button_video_ignore_same_size: gtk4::CheckButton = builder.object("check_button_video_ignore_same_size").unwrap();
let check_button_image_ignore_same_size: CheckButton = builder.object("check_button_image_ignore_same_size").unwrap();
let check_button_video_ignore_same_size: CheckButton = builder.object("check_button_video_ignore_same_size").unwrap();
let label_similar_images_minimal_similarity: gtk4::Label = builder.object("label_similar_images_minimal_similarity").unwrap();
let label_similar_images_minimal_similarity: Label = builder.object("label_similar_images_minimal_similarity").unwrap();
let label_duplicate_check_method: gtk4::Label = builder.object("label_duplicate_check_method").unwrap();
let label_duplicate_hash_type: gtk4::Label = builder.object("label_duplicate_hash_type").unwrap();
let label_big_shown_files: gtk4::Label = builder.object("label_big_shown_files").unwrap();
let label_image_resize_algorithm: gtk4::Label = builder.object("label_image_resize_algorithm").unwrap();
let label_image_hash_type: gtk4::Label = builder.object("label_image_hash_type").unwrap();
let label_image_hash_size: gtk4::Label = builder.object("label_image_hash_size").unwrap();
let label_image_similarity: gtk4::Label = builder.object("label_image_similarity").unwrap();
let label_image_similarity_max: gtk4::Label = builder.object("label_image_similarity_max").unwrap();
let label_video_similarity: gtk4::Label = builder.object("label_video_similarity").unwrap();
let label_video_similarity_min: gtk4::Label = builder.object("label_video_similarity_min").unwrap();
let label_video_similarity_max: gtk4::Label = builder.object("label_video_similarity_max").unwrap();
let label_duplicate_check_method: Label = builder.object("label_duplicate_check_method").unwrap();
let label_duplicate_hash_type: Label = builder.object("label_duplicate_hash_type").unwrap();
let label_big_shown_files: Label = builder.object("label_big_shown_files").unwrap();
let label_image_resize_algorithm: Label = builder.object("label_image_resize_algorithm").unwrap();
let label_image_hash_type: Label = builder.object("label_image_hash_type").unwrap();
let label_image_hash_size: Label = builder.object("label_image_hash_size").unwrap();
let label_image_similarity: Label = builder.object("label_image_similarity").unwrap();
let label_image_similarity_max: Label = builder.object("label_image_similarity_max").unwrap();
let label_video_similarity: Label = builder.object("label_video_similarity").unwrap();
let label_video_similarity_min: Label = builder.object("label_video_similarity_min").unwrap();
let label_video_similarity_max: Label = builder.object("label_video_similarity_max").unwrap();
let image_preview_similar_images: gtk4::Image = builder.object("image_preview_similar_images").unwrap();
let image_preview_duplicates: gtk4::Image = builder.object("image_preview_duplicates").unwrap();
let image_preview_similar_images: Image = builder.object("image_preview_similar_images").unwrap();
let image_preview_duplicates: Image = builder.object("image_preview_duplicates").unwrap();
Self {
notebook_main,
@ -411,8 +411,8 @@ impl GuiMainNotebook {
}
}
let vec_children: Vec<gtk4::Widget> = get_all_children(&self.notebook_main);
let vec_children: Vec<gtk4::Widget> = get_all_children(&vec_children[1]);
let vec_children: Vec<Widget> = get_all_children(&self.notebook_main);
let vec_children: Vec<Widget> = get_all_children(&vec_children[1]);
// Change name of main notebook tabs
for (main_enum, fl_thing) in [
@ -431,7 +431,7 @@ impl GuiMainNotebook {
self.notebook_main
.tab_label(&vec_children[main_enum])
.unwrap()
.downcast::<gtk4::Label>()
.downcast::<Label>()
.unwrap()
.set_text(&fl_thing);
}
@ -490,7 +490,7 @@ impl GuiMainNotebook {
flg!("main_tree_view_column_genre"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Music Dupliactes
], // Music Duplicates
vec![
flg!("main_tree_view_column_symlink_file_name"),
flg!("main_tree_view_column_symlink_folder"),

View File

@ -18,7 +18,7 @@ pub struct GuiProgressDialog {
pub grid_progress_stages: gtk4::Grid,
pub button_stop_in_dialog: gtk4::Button,
pub evk_button_stop_in_dialog: gtk4::EventControllerKey,
pub evk_button_stop_in_dialog: EventControllerKey,
}
impl GuiProgressDialog {

View File

@ -6,7 +6,7 @@ use crate::help_functions::get_all_children;
#[derive(Clone)]
pub struct GuiSettings {
pub window_settings: gtk4::Window,
pub window_settings: Window,
pub notebook_settings: gtk4::Notebook,
@ -57,7 +57,7 @@ impl GuiSettings {
let glade_src = include_str!("../../ui/settings.ui").to_string();
let builder = Builder::from_string(glade_src.as_str());
let window_settings: gtk4::Window = builder.object("window_settings").unwrap();
let window_settings: Window = builder.object("window_settings").unwrap();
window_settings.set_title(Some(&flg!("window_settings_title")));
window_settings.set_modal(true);
window_settings.set_transient_for(Some(window_main));

View File

@ -12,14 +12,14 @@ pub struct GuiUpperNotebook {
pub scrolled_window_included_directories: gtk4::ScrolledWindow,
pub scrolled_window_excluded_directories: gtk4::ScrolledWindow,
pub tree_view_included_directories: gtk4::TreeView,
pub tree_view_excluded_directories: gtk4::TreeView,
pub tree_view_included_directories: TreeView,
pub tree_view_excluded_directories: TreeView,
pub evk_tree_view_included_directories: gtk4::EventControllerKey,
pub evk_tree_view_excluded_directories: gtk4::EventControllerKey,
pub evk_tree_view_included_directories: EventControllerKey,
pub evk_tree_view_excluded_directories: EventControllerKey,
pub gc_tree_view_included_directories: gtk4::GestureClick,
pub gc_tree_view_excluded_directories: gtk4::GestureClick,
pub gc_tree_view_included_directories: GestureClick,
pub gc_tree_view_excluded_directories: GestureClick,
pub entry_excluded_items: gtk4::Entry,
pub entry_allowed_extensions: gtk4::Entry,
@ -50,17 +50,17 @@ impl GuiUpperNotebook {
let scrolled_window_included_directories: gtk4::ScrolledWindow = builder.object("scrolled_window_included_directories").unwrap();
let scrolled_window_excluded_directories: gtk4::ScrolledWindow = builder.object("scrolled_window_excluded_directories").unwrap();
let tree_view_included_directories: gtk4::TreeView = TreeView::new();
let tree_view_excluded_directories: gtk4::TreeView = TreeView::new();
let tree_view_included_directories: TreeView = TreeView::new();
let tree_view_excluded_directories: TreeView = TreeView::new();
let evk_tree_view_included_directories: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_included_directories: EventControllerKey = EventControllerKey::new();
tree_view_included_directories.add_controller(&evk_tree_view_included_directories);
let evk_tree_view_excluded_directories: gtk4::EventControllerKey = EventControllerKey::new();
let evk_tree_view_excluded_directories: EventControllerKey = EventControllerKey::new();
tree_view_excluded_directories.add_controller(&evk_tree_view_excluded_directories);
let gc_tree_view_included_directories: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_included_directories: GestureClick = GestureClick::new();
tree_view_included_directories.add_controller(&gc_tree_view_included_directories);
let gc_tree_view_excluded_directories: gtk4::GestureClick = GestureClick::new();
let gc_tree_view_excluded_directories: GestureClick = GestureClick::new();
tree_view_excluded_directories.add_controller(&gc_tree_view_excluded_directories);
let entry_allowed_extensions: gtk4::Entry = builder.object("entry_allowed_extensions").unwrap();

View File

@ -7,6 +7,7 @@ pub struct HashTypeStruct {
pub eng_name: &'static str,
pub hash_type: HashType,
}
pub const DUPLICATES_HASH_TYPE_COMBO_BOX: [HashTypeStruct; 3] = [
HashTypeStruct {
eng_name: "Blake3",
@ -21,6 +22,7 @@ pub const DUPLICATES_HASH_TYPE_COMBO_BOX: [HashTypeStruct; 3] = [
hash_type: HashType::Xxh3,
},
];
pub struct CheckMethodStruct {
pub eng_name: &'static str,
pub check_method: CheckingMethod,

View File

@ -1,13 +1,12 @@
use gdk4::gdk_pixbuf::{InterpType, Pixbuf};
use std::cmp::Ordering;
use std::collections::HashMap;
use std::path::{Path, PathBuf};
use czkawka_core::bad_extensions::BadExtensions;
use gdk4::gdk_pixbuf::{InterpType, Pixbuf};
use gtk4::prelude::*;
use gtk4::{ListStore, TextView, TreeView, Widget};
use crate::flg;
use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::common_dir_traversal;
@ -21,6 +20,7 @@ use czkawka_core::similar_images::SimilarImages;
use czkawka_core::similar_videos::SimilarVideos;
use czkawka_core::temporary::Temporary;
use crate::flg;
use crate::notebook_enums::{NotebookMainEnum, NotebookUpperEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
#[cfg(not(target_family = "windows"))]
@ -263,6 +263,7 @@ pub enum ColumnsIncludedDirectory {
Path = 0,
ReferenceButton,
}
pub enum ColumnsExcludedDirectory {
// Columns for Excluded Directories in upper Notebook
Path = 0,
@ -378,8 +379,8 @@ pub const MAIN_ROW_COLOR: &str = "#222222";
pub const HEADER_ROW_COLOR: &str = "#111111";
pub const TEXT_COLOR: &str = "#ffffff";
pub fn get_string_from_list_store(tree_view: &gtk4::TreeView, column_full_path: i32, column_selection: Option<i32>) -> Vec<String> {
let list_store: gtk4::ListStore = get_list_store(tree_view);
pub fn get_string_from_list_store(tree_view: &TreeView, column_full_path: i32, column_selection: Option<i32>) -> Vec<String> {
let list_store: ListStore = get_list_store(tree_view);
let mut string_vector: Vec<String> = Vec::new();
@ -419,7 +420,7 @@ pub fn split_path(path: &Path) -> (String, String) {
}
}
pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gtk4::TextView) {
pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &TextView) {
let mut messages: String = String::from("");
if !text_messages.messages.is_empty() {
messages += format!("############### {}({}) ###############\n", flg!("text_view_messages"), text_messages.messages.len()).as_str();
@ -469,7 +470,7 @@ pub fn add_text_to_text_view(text_view: &TextView, string_to_append: &str) {
}
}
pub fn set_buttons(hashmap: &mut HashMap<BottomButtonsEnum, bool>, buttons_array: &[gtk4::Widget], button_names: &[BottomButtonsEnum]) {
pub fn set_buttons(hashmap: &mut HashMap<BottomButtonsEnum, bool>, buttons_array: &[Widget], button_names: &[BottomButtonsEnum]) {
for (index, button) in buttons_array.iter().enumerate() {
if *hashmap.get_mut(&button_names[index]).unwrap() {
button.show();
@ -492,8 +493,8 @@ pub fn get_text_from_invalid_symlink_cause(error: &common_dir_traversal::ErrorTy
}
}
pub fn get_list_store(tree_view: &gtk4::TreeView) -> ListStore {
tree_view.model().unwrap().downcast::<gtk4::ListStore>().unwrap()
pub fn get_list_store(tree_view: &TreeView) -> ListStore {
tree_view.model().unwrap().downcast::<ListStore>().unwrap()
}
pub fn get_dialog_box_child(dialog: &gtk4::Dialog) -> gtk4::Box {
@ -509,7 +510,7 @@ pub fn change_dimension_to_krotka(dimensions: String) -> (u64, u64) {
(number1, number2)
}
pub fn get_notebook_enum_from_tree_view(tree_view: &gtk4::TreeView) -> NotebookMainEnum {
pub fn get_notebook_enum_from_tree_view(tree_view: &TreeView) -> NotebookMainEnum {
match (*tree_view).widget_name().to_string().as_str() {
"tree_view_duplicate_finder" => NotebookMainEnum::Duplicate,
"tree_view_empty_folder_finder" => NotebookMainEnum::EmptyDirectories,
@ -528,7 +529,7 @@ pub fn get_notebook_enum_from_tree_view(tree_view: &gtk4::TreeView) -> NotebookM
}
}
pub fn get_notebook_upper_enum_from_tree_view(tree_view: &gtk4::TreeView) -> NotebookUpperEnum {
pub fn get_notebook_upper_enum_from_tree_view(tree_view: &TreeView) -> NotebookUpperEnum {
match (*tree_view).widget_name().to_string().as_str() {
"tree_view_upper_included_directories" => NotebookUpperEnum::IncludedDirectories,
"tree_view_upper_excluded_directories" => NotebookUpperEnum::ExcludedDirectories,
@ -538,7 +539,7 @@ pub fn get_notebook_upper_enum_from_tree_view(tree_view: &gtk4::TreeView) -> Not
}
}
pub fn get_notebook_object_from_tree_view(tree_view: &gtk4::TreeView) -> &NotebookObject {
pub fn get_notebook_object_from_tree_view(tree_view: &TreeView) -> &NotebookObject {
let nb_enum = get_notebook_enum_from_tree_view(tree_view);
&NOTEBOOKS_INFOS[nb_enum as usize]
}
@ -552,7 +553,7 @@ pub fn get_full_name_from_path_name(path: &str, name: &str) -> String {
}
// After e.g. deleting files, header may become orphan or have one child, so should be deleted in this case
pub fn clean_invalid_headers(model: &gtk4::ListStore, column_header: i32, column_path: i32) {
pub fn clean_invalid_headers(model: &ListStore, column_header: i32, column_path: i32) {
// Remove only child from header
if let Some(first_iter) = model.iter_first() {
let mut vec_tree_path_to_delete: Vec<gtk4::TreePath> = Vec::new();
@ -675,6 +676,7 @@ pub fn clean_invalid_headers(model: &gtk4::ListStore, column_header: i32, column
}
}
}
pub fn check_how_much_elements_is_selected(tree_view: &TreeView, column_header: Option<i32>, column_selection: i32) -> (u64, u64) {
let mut number_of_selected_items: u64 = 0;
let mut number_of_selected_groups: u64 = 0;
@ -783,8 +785,8 @@ pub fn get_max_file_name(file_name: &str, max_length: usize) -> String {
}
}
pub fn get_custom_label_from_widget<P: IsA<gtk4::Widget>>(item: &P) -> gtk4::Label {
let mut widgets_to_check = vec![item.clone().upcast::<gtk4::Widget>()];
pub fn get_custom_label_from_widget<P: IsA<Widget>>(item: &P) -> gtk4::Label {
let mut widgets_to_check = vec![item.clone().upcast::<Widget>()];
while let Some(widget) = widgets_to_check.pop() {
if let Ok(label) = widget.clone().downcast::<gtk4::Label>() {
@ -795,8 +797,9 @@ pub fn get_custom_label_from_widget<P: IsA<gtk4::Widget>>(item: &P) -> gtk4::Lab
}
panic!("Button doesn't have proper custom label child");
}
pub fn get_custom_label_with_name_from_widget<P: IsA<gtk4::Widget>>(item: &P, name: &str) -> gtk4::Label {
let mut widgets_to_check = vec![item.clone().upcast::<gtk4::Widget>()];
pub fn get_custom_label_with_name_from_widget<P: IsA<Widget>>(item: &P, name: &str) -> gtk4::Label {
let mut widgets_to_check = vec![item.clone().upcast::<Widget>()];
while let Some(widget) = widgets_to_check.pop() {
if let Ok(label) = widget.clone().downcast::<gtk4::Label>() {
@ -809,8 +812,9 @@ pub fn get_custom_label_with_name_from_widget<P: IsA<gtk4::Widget>>(item: &P, na
}
panic!("Button doesn't have proper custom label child");
}
pub fn get_custom_image_from_widget<P: IsA<gtk4::Widget>>(item: &P) -> gtk4::Image {
let mut widgets_to_check = vec![item.clone().upcast::<gtk4::Widget>()];
pub fn get_custom_image_from_widget<P: IsA<Widget>>(item: &P) -> gtk4::Image {
let mut widgets_to_check = vec![item.clone().upcast::<Widget>()];
while let Some(widget) = widgets_to_check.pop() {
if let Ok(image) = widget.clone().downcast::<gtk4::Image>() {
@ -823,8 +827,8 @@ pub fn get_custom_image_from_widget<P: IsA<gtk4::Widget>>(item: &P) -> gtk4::Ima
}
#[allow(dead_code)]
pub fn debug_print_widget<P: IsA<gtk4::Widget>>(item: &P) {
let mut widgets_to_check = vec![(0, 0, item.clone().upcast::<gtk4::Widget>())];
pub fn debug_print_widget<P: IsA<Widget>>(item: &P) {
let mut widgets_to_check = vec![(0, 0, item.clone().upcast::<Widget>())];
let mut next_free_number = 1;
println!("{}, {}, {:?} ", widgets_to_check[0].0, widgets_to_check[0].1, widgets_to_check[0].2);
@ -837,8 +841,9 @@ pub fn debug_print_widget<P: IsA<gtk4::Widget>>(item: &P) {
println!("{}, {}, {:?} ", current_number, parent_number, widget);
}
}
pub fn get_all_boxes_from_widget<P: IsA<gtk4::Widget>>(item: &P) -> Vec<gtk4::Box> {
let mut widgets_to_check = vec![item.clone().upcast::<gtk4::Widget>()];
pub fn get_all_boxes_from_widget<P: IsA<Widget>>(item: &P) -> Vec<gtk4::Box> {
let mut widgets_to_check = vec![item.clone().upcast::<Widget>()];
let mut boxes = Vec::new();
while let Some(widget) = widgets_to_check.pop() {
@ -850,7 +855,7 @@ pub fn get_all_boxes_from_widget<P: IsA<gtk4::Widget>>(item: &P) -> Vec<gtk4::Bo
boxes
}
pub fn get_all_children<P: IsA<gtk4::Widget>>(wid: &P) -> Vec<gtk4::Widget> {
pub fn get_all_children<P: IsA<Widget>>(wid: &P) -> Vec<Widget> {
let mut vector = vec![];
if let Some(mut child) = wid.first_child() {
vector.push(child.clone());
@ -869,7 +874,7 @@ pub fn get_all_children<P: IsA<gtk4::Widget>>(wid: &P) -> Vec<gtk4::Widget> {
const SIZE_OF_ICON: i32 = 18;
const TYPE_OF_INTERPOLATION: InterpType = InterpType::Tiles;
pub fn set_icon_of_button<P: IsA<gtk4::Widget>>(button: &P, data: &'static [u8]) {
pub fn set_icon_of_button<P: IsA<Widget>>(button: &P, data: &'static [u8]) {
let image = get_custom_image_from_widget(&button.clone());
let pixbuf = Pixbuf::from_read(std::io::BufReader::new(data)).unwrap();
let pixbuf = pixbuf.scale_simple(SIZE_OF_ICON, SIZE_OF_ICON, TYPE_OF_INTERPOLATION).unwrap();

View File

@ -8,13 +8,13 @@ use gtk4::gdk_pixbuf::InterpType;
use gtk4::prelude::*;
use gtk4::{CheckButton, Image, SelectionMode, TextView, TreeView};
use crate::flg;
use czkawka_core::common::{IMAGE_RS_EXTENSIONS, RAW_IMAGE_EXTENSIONS};
use czkawka_core::similar_images::SIMILAR_VALUES;
use czkawka_core::similar_videos::MAX_TOLERANCE;
use crate::create_tree_view::*;
use crate::delete_things;
use crate::flg;
use crate::gui_structs::gui_data::*;
use crate::help_combo_box::{
DUPLICATES_CHECK_METHOD_COMBO_BOX, DUPLICATES_HASH_TYPE_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX, IMAGES_HASH_TYPE_COMBO_BOX, IMAGES_RESIZE_ALGORITHM_COMBO_BOX,
@ -584,6 +584,7 @@ fn connect_event_mouse(gui_data: &GuiData) {
});
}
}
fn connect_event_buttons(gui_data: &GuiData) {
for evk in [
//gui_data.main_notebook.evk_tree_view_duplicate_finder.clone(), // Manual - needs to show/hide preview
@ -625,7 +626,7 @@ fn connect_event_buttons(gui_data: &GuiData) {
let preview_path = preview_path.clone();
let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::Duplicate as usize];
show_preview(
&event_controller_key.widget().downcast::<gtk4::TreeView>().unwrap(),
&event_controller_key.widget().downcast::<TreeView>().unwrap(),
&text_view_errors,
&check_button_settings_show_preview,
&image_preview,
@ -653,7 +654,7 @@ fn connect_event_buttons(gui_data: &GuiData) {
let preview_path = preview_path.clone();
let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::SimilarImages as usize];
show_preview(
&event_controller_key.widget().downcast::<gtk4::TreeView>().unwrap(),
&event_controller_key.widget().downcast::<TreeView>().unwrap(),
&text_view_errors,
&check_button_settings_show_preview_similar_images,
&image_preview,

View File

@ -5,20 +5,14 @@
#![allow(clippy::type_complexity)]
#![allow(clippy::needless_late_init)]
use std::env;
use std::ffi::OsString;
use gtk4::gio::ApplicationFlags;
use gtk4::prelude::*;
use gtk4::Application;
use gtk4::Inhibit;
use std::env;
use std::ffi::OsString;
use czkawka_core::*;
use crate::compute_results::*;
use crate::initialize_gui::*;
use crate::language_functions::LANGUAGES_ALL;
use crate::saving_loading::*;
use crate::tests::validate_notebook_data;
use connect_things::connect_about_buttons::*;
use connect_things::connect_button_compare::*;
use connect_things::connect_button_delete::*;
@ -38,8 +32,15 @@ use connect_things::connect_selection_of_directories::*;
use connect_things::connect_settings::*;
use connect_things::connect_show_hide_ui::*;
use connect_things::connect_similar_image_size_change::*;
use czkawka_core::*;
use gui_structs::gui_data::*;
use crate::compute_results::*;
use crate::initialize_gui::*;
use crate::language_functions::LANGUAGES_ALL;
use crate::saving_loading::*;
use crate::tests::validate_notebook_data;
mod compute_results;
mod connect_things;
mod create_tree_view;
@ -60,13 +61,14 @@ mod taskbar_progress_win;
mod tests;
fn main() {
let application = gtk4::Application::new(None, ApplicationFlags::HANDLES_OPEN | ApplicationFlags::HANDLES_COMMAND_LINE);
let application = Application::new(None, ApplicationFlags::HANDLES_OPEN | ApplicationFlags::HANDLES_COMMAND_LINE);
application.connect_command_line(move |app, cmdline| {
build_ui(app, cmdline.arguments());
0
});
application.run_with_args(&env::args().collect::<Vec<_>>());
}
fn build_ui(application: &Application, arguments: Vec<OsString>) {
let mut gui_data: GuiData = GuiData::new_with_application(application);

View File

@ -65,7 +65,7 @@ pub fn opening_double_click_function_directories(gesture_click: &GestureClick, n
}
}
pub fn opening_enter_function_ported(event_controller: &gtk4::EventControllerKey, _key: gdk4::Key, key_code: u32, _modifier_type: ModifierType) -> gtk4::Inhibit {
pub fn opening_enter_function_ported(event_controller: &gtk4::EventControllerKey, _key: Key, key_code: u32, _modifier_type: ModifierType) -> Inhibit {
let tree_view = event_controller.widget().downcast::<gtk4::TreeView>().unwrap();
#[cfg(debug_assertions)]
{
@ -139,6 +139,7 @@ fn common_open_function(tree_view: &gtk4::TreeView, column_name: i32, column_pat
// }
}
}
fn reverse_selection(tree_view: &gtk4::TreeView, column_header: i32, column_selection: i32) {
let (selected_rows, model) = tree_view.selection().selected_rows();
let model = model.downcast::<gtk4::ListStore>().unwrap();
@ -236,6 +237,7 @@ pub fn select_function_similar_images(_tree_selection: &gtk4::TreeSelection, tre
pub fn select_function_similar_videos(_tree_selection: &gtk4::TreeSelection, tree_model: &gtk4::TreeModel, tree_path: &gtk4::TreePath, _is_path_currently_selected: bool) -> bool {
!tree_model.get::<bool>(&tree_model.iter(tree_path).unwrap(), ColumnsSimilarVideos::IsHeader as i32)
}
pub fn select_function_always_true(_tree_selection: &gtk4::TreeSelection, _tree_model: &gtk4::TreeModel, _tree_path: &gtk4::TreePath, _is_path_currently_selected: bool) -> bool {
true
}

View File

@ -5,15 +5,15 @@ use std::io::{Read, Write};
use std::path::{Path, PathBuf};
use std::{env, fs};
use czkawka_core::common_dir_traversal::CheckingMethod;
use directories_next::ProjectDirs;
use gtk4::prelude::*;
use gtk4::{ComboBoxText, ScrolledWindow, TextView};
use crate::flg;
use crate::gui_structs::gui_main_notebook::GuiMainNotebook;
use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::similar_images::SIMILAR_VALUES;
use crate::flg;
use crate::gui_structs::gui_main_notebook::GuiMainNotebook;
use crate::gui_structs::gui_settings::GuiSettings;
use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook;
use crate::help_combo_box::DUPLICATES_CHECK_METHOD_COMBO_BOX;
@ -64,11 +64,11 @@ const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["C:\\Windows"];
struct LoadSaveStruct {
loaded_items: HashMap<String, Vec<String>>,
text_view: gtk4::TextView,
text_view: TextView,
}
impl LoadSaveStruct {
pub fn with_text_view(text_view: gtk4::TextView) -> Self {
pub fn with_text_view(text_view: TextView) -> Self {
Self {
loaded_items: Default::default(),
text_view,

View File

@ -156,7 +156,7 @@
<object class="GtkCheckButton" id="check_button_settings_hide_hard_links">
<property name="active">1</property>
<property name="focusable">1</property>
<property name="label" translatable="yes">Hide hard links(only Linux and MacOS)</property>
<property name="label" translatable="yes">Hide hard links(only Linux and macOS)</property>
</object>
</child>
<child>

View File

@ -18,7 +18,7 @@ The GUI is built from different pieces:
- 3 - Main results window - allows to choose, delete, configure results.
- 4 - Bottom image panels - contains buttons which do specific actions on data(like selecting them) or e.g. hide/show parts of GUI
- 5 - Text panel - prints messages/warnings/errors about executed actions. User can hide it.
- 6 - Panel with selecting specific directories to use or exclude. Also here are specified allowed extensions and file sizes.
- 6 - Panel with selecting specific directories to use or exclude. Also, here are specified allowed extensions and file sizes.
- 7 - Buttons which opens About Window(shows info about app) and Settings in which scan can be customized
<img src="https://user-images.githubusercontent.com/41945903/148279809-54ea8684-8bff-436b-af67-ff9859f468f2.png" width="800" />
@ -28,17 +28,17 @@ GUI is fully translatable.
For now at least 10 languages are supported(some was translated by computers)
### Opening/Manipulating files
It is possible to open selected files by double clicking on them.
It is possible to open selected files by double-clicking on them.
To open multiple file just select desired files with CTRL key pressed and still when clicking this key, double click at selected items with left mouse button.
To open multiple file just select desired files with CTRL key pressed and still when clicking this key, double-click at selected items with left mouse button.
To open folder containing selected file, just click twice on it with right mouse button.
To invert a selection of files, click on a file with the middle mouse button and it will invert the selection of the other files in the same group.
To invert a selection of files, click on a file with the middle mouse button, and it will invert the selection of the other files in the same group.
### Adding directories
By default current path is loaded to included directory and excluded directories are filled with default paths.
By default, current path is loaded to included directory and excluded directories are filled with default paths.
It is possible to override this, by adding arguments when opening app e.g. `czkawka_gui /home /usr --/home/rafal --/home/zaba` which means that `/home` and `/usr` directories will be checked and `/home/rafal` and `/home/zaba` will be excluded.
@ -64,13 +64,13 @@ By default, all tools only write about results to console, but it is possible wi
## Config/Cache files
Currently, Czkawka stores few config and cache files on disk:
- `czkawka_gui_config.txt` - stores configuration of GUI which may be loaded at startup
- `cache_similar_image_SIZE_HASH_FILTER.bin/json` - stores cache data and hashes which may be used later without needing to compute image hash again.. Each algorithms uses its own file, because hashes are completely different in each.
- `cache_similar_image_SIZE_HASH_FILTER.bin/json` - stores cache data and hashes which may be used later without needing to compute image hash again. Each algorithms use its own file, because hashes are completely different in each.
- `cache_broken_files.txt` - stores cache data of broken files
- `cache_duplicates_HASH.txt` - stores cache data of duplicated files, to not suffer too big of a performance hit when saving/loading file, only already fully hashed files bigger than 5MB are stored. Similar files with replaced `Blake3` to e.g. `SHA256` may be shown, when support for new hashes will be introduced in Czkawka.
- `cache_similar_videos.bin/json` - stores cache data of video files.
Editing `bin` files may cause showing strange crashes, so in case of having any, removing these files should help.
It is possible to modify files with JSON extension(may be helpful when moving files to different disk or trying to use cache file on different computer). To do this, it is required to enable in settings option to generate also cache json file. Next file can be changed/modified. By default cache files with `bin` extension are loaded, but if it is missing(can be renamed or removed), then data from json file is loaded if exists.
It is possible to modify files with JSON extension(may be helpful when moving files to different disk or trying to use cache file on different computer). To do this, it is required to enable in settings option to generate also cache json file. Next file can be changed/modified. By default, cache files with `bin` extension are loaded, but if it is missing(can be renamed or removed), then data from json file is loaded if exists.
Config files are located in this path:
@ -99,7 +99,7 @@ Windows - `C:\Users\Username\AppData\Local\Qarmin\Czkawka\cache`
- It is possible to open parent folder of selected items with double click with right mouse button(RMB)
it is also possible to open such item with double click with left mouse button(LMB).
- **Faster scanning for big number of duplicates**
By default for all files grouped by same size are computed partial hash(hash from only of 2KB each file). Such hash is computed usually very fast, especially on SSD and fast multicore processors. But when scanning a hundred of thousands or millions of files with HDD or slow processor, usually this step can take much time. In settings exists option `Use prehash cache` which enables caching such things. It is disabled by default because can increase time of loading/saving cache, with big number of entries.
By default for all files grouped by same size are computed partial hash(hash from only of 2KB each file). Such hash is computed usually very fast, especially on SSD and fast multicore processors. But when scanning a hundred of thousands or millions of files with HDD or slow processor, typically this step can take much time. In settings exists option `Use prehash cache` which enables caching such things. It is disabled by default because can increase time of loading/saving cache, with big number of entries.
- **Permanent store of cache entries**
After each scan, entries in cache are validated and outdated ones(which points at non-existent files) are removed. This may be problematic when scanning external drivers(like pendrives, disks etc.) and later unplugging and plugging them again. In settings exists option `Delete outdated cache entries automatically` which automatically clear this, but this can be disabled. Disabling such option may create big cache files, so button `Remove outdated results` will do it manually.
- **Partial scanning**
@ -176,9 +176,9 @@ This only removes the most basic temporary files, for more I suggest to use Blea
### Invalid Symlinks
To find invalid symlinks we must first find symlinks.
After searching for them you should check at which element it points to and if it does not exist, add this symlinks into the list of invalid symlinks, pointing to a non-existent path.
After searching for them, you should check at which element it points to and if it does not exist, add this symlinks into the list of invalid symlinks, pointing to a non-existent path.
The second mode is to detect recursive symlink. Unfortunately, this mode does not work and it displays when using it an error of a non-existent target element, but it is implemented by counting the jumps of the symlink and after exceeding a certain number (e.g. 20) it is considered that the given symlink is recursive.
The second mode is to detect recursive symlink. Unfortunately, this mode does not work, and it displays when using it an error of a non-existent target element, but it is implemented by counting the jumps of the symlink and after exceeding a certain number (e.g. 20) it is considered that the given symlink is recursive.
### Same Music
This is a mode to find identical music files through tags.
@ -202,7 +202,7 @@ It is a tool for finding similar images that differ e.g. in watermark, size etc.
The tool first collects images with specific extensions that can be checked - `[".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".tif", ".pnm", ".tga", ".ff", ".gif", ".jif", ".jfi", ".ico", ".webp", ".avif"]`.
Next cached data is loaded from file to prevent hashing twice the same file.
The cache which points to non existing data, by default is deleted automatically.
The cache which points to non-existing data, by default is deleted automatically.
Then a perceptual hash is created for each image which isn't available in cache.
@ -232,7 +232,7 @@ Some images broke hash functions and create hashes full of `0` or `255`, so thes
You can test each algorithm with provided CLI tool, just put to folder `test.jpg` file and run inside this command `czkawka_cli tester -i`
Faster compare option allows to only once compare results, so checking should works a lot of faster when using higher number of similarity.
Faster compare option allows to only once compare results, so checking should work a lot of faster when using higher number of similarity.
Some tidbits:
- Smaller hash size not always means that calculating it will take more time

View File

@ -2,8 +2,8 @@ import os
import sys
if len(sys.argv) != 4:
print("ERROR: Not provided 3 required arguments - " + str(sys.argv))
exit(1)
print("ERROR: Not provided 3 required arguments - " + str(sys.argv))
exit(1)
folder_name = sys.argv[1]
files_required = sys.argv[2]
@ -11,13 +11,12 @@ directories_required = sys.argv[3]
file_count = sum(len(files) for _, _, files in os.walk(folder_name))
if str(file_count) != files_required:
print("Current files: " + str(file_count) + ", but required is: " + str(files_required))
print("This commit probably introduced regression, please recheck it.")
exit(1)
print("Current files: " + str(file_count) + ", but required is: " + str(files_required))
print("This commit probably introduced regression, please recheck it.")
exit(1)
directory_count = sum(len(dire) for _, dire, files in os.walk(folder_name))
if str(directory_count) != directories_required:
print("Current directories: " + str(directory_count) + ", but required is: " + str(directories_required))
print("This commit probably introduced regression, please recheck it.")
exit(1)
print("Current directories: " + str(directory_count) + ", but required is: " + str(directories_required))
print("This commit probably introduced regression, please recheck it.")
exit(1)

View File

@ -1,47 +0,0 @@
translations = ["pl", "it", "de"] # en is missing here
base_translation = "en"
base_keywords = []
with open('i18n/' + base_translation + "/czkawka_gui.ftl", 'r') as file:
base_translation_file_content = file.readlines()
for line in base_translation_file_content:
if line.find("=") != -1:
first_split = line.split("=")[0].strip()
# Debug check, check for usage of AAAAA in result to see which esults are unused
# To check in what exactly places are usused, remove -c parameter
# print("rg \"" + first_split + "\" czkawka_gui/src -c;echo \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - "+first_split+"\"")
try:
base_keywords.index(first_split)
print("Duplicated member " + first_split +" in base translation")
except:
True # All good
base_keywords.append(first_split)
for lang in translations:
print("\nChecking " + lang + " language")
lang_keywords = []
with open('i18n/' + lang + "/czkawka_gui.ftl", 'r') as file:
file_content = file.readlines()
for line in file_content:
if line.find("=") != -1:
first_split = line.split("=")[0].strip()
try:
lang_keywords.index(first_split)
print("Duplicated member " + first_split +" in " + lang + " translation")
except:
True # All good
lang_keywords.append(first_split)
for keyword in base_keywords:
try:
lang_keywords.index(keyword)
except:
print("Missing keyword - " + keyword)
for keyword in lang_keywords:
try:
base_keywords.index(keyword)
except:
print("Unused keyword - " + keyword)