1
0
Fork 0
mirror of synced 2024-04-25 16:22:07 +12:00

Add smallest files mode (#746)

This commit is contained in:
Rafał Mikrut 2022-06-04 21:20:21 +02:00 committed by GitHub
parent cf94ab918e
commit ec13f86aee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 229 additions and 93 deletions

View file

@ -14,6 +14,7 @@ use crossbeam_channel::Receiver;
use humansize::{file_size_opts as options, FileSize};
use rayon::prelude::*;
use crate::common::split_path;
use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
@ -35,6 +36,12 @@ pub struct FileEntry {
pub modified_date: u64,
}
#[derive(Copy, Clone, Eq, PartialEq)]
pub enum SearchMode {
BiggestFiles,
SmallestFiles,
}
#[derive(Eq, PartialEq, Clone, Debug)]
pub enum DeleteMethod {
None,
@ -57,7 +64,7 @@ impl Info {
pub struct BigFile {
text_messages: Messages,
information: Info,
big_files: BTreeMap<u64, Vec<FileEntry>>,
big_files: Vec<(u64, FileEntry)>,
excluded_items: ExcludedItems,
directories: Directories,
allowed_extensions: Extensions,
@ -65,6 +72,7 @@ pub struct BigFile {
number_of_files_to_check: usize,
delete_method: DeleteMethod,
stopped_search: bool,
search_mode: SearchMode,
}
impl BigFile {
@ -80,6 +88,7 @@ impl BigFile {
number_of_files_to_check: 50,
delete_method: DeleteMethod::None,
stopped_search: false,
search_mode: SearchMode::SmallestFiles,
}
}
@ -96,7 +105,11 @@ impl BigFile {
self.stopped_search
}
pub const fn get_big_files(&self) -> &BTreeMap<u64, Vec<FileEntry>> {
pub fn set_search_mode(&mut self, search_mode: SearchMode) {
self.search_mode = search_mode;
}
pub const fn get_big_files(&self) -> &Vec<(u64, FileEntry)> {
&self.big_files
}
@ -129,6 +142,7 @@ impl BigFile {
fn look_for_big_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let start_time: SystemTime = SystemTime::now();
let mut folders_to_check: Vec<PathBuf> = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector
let mut old_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
// Add root folders for finding
for id in &self.directories.included_directories {
@ -235,6 +249,10 @@ impl BigFile {
} else if metadata.is_file() {
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
if metadata.len() == 0 {
continue 'dir;
}
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
@ -295,8 +313,8 @@ impl BigFile {
folders_to_check.extend(segment);
self.text_messages.warnings.extend(warnings);
for (size, fe) in fe_result {
self.big_files.entry(size).or_insert_with(Vec::new);
self.big_files.get_mut(&size).unwrap().push(fe);
old_map.entry(size).or_insert_with(Vec::new);
old_map.get_mut(&size).unwrap().push(fe);
}
}
}
@ -306,14 +324,25 @@ impl BigFile {
progress_thread_handle.join().unwrap();
// Extract n biggest files to new TreeMap
let mut new_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
for (size, vector) in self.big_files.iter().rev() {
let iter: Box<dyn Iterator<Item = _>>;
if self.search_mode == SearchMode::SmallestFiles {
iter = Box::new(old_map.into_iter());
} else {
iter = Box::new(old_map.into_iter().rev());
}
for (size, mut vector) in iter {
if self.information.number_of_real_files < self.number_of_files_to_check {
if vector.len() > 1 {
vector.sort_by_key(|e| {
let t = split_path(e.path.as_path());
(t.0, t.1)
});
}
for file in vector {
if self.information.number_of_real_files < self.number_of_files_to_check {
new_map.entry(*size).or_insert_with(Vec::new);
new_map.get_mut(size).unwrap().push(file.clone());
self.big_files.push((size, file));
self.information.number_of_real_files += 1;
} else {
break;
@ -323,7 +352,6 @@ impl BigFile {
break;
}
}
self.big_files = new_map;
Common::print_time(start_time, SystemTime::now(), "look_for_big_files".to_string());
true
@ -357,11 +385,9 @@ impl BigFile {
match self.delete_method {
DeleteMethod::Delete => {
for vec_file_entry in self.big_files.values() {
for file_entry in vec_file_entry {
if fs::remove_file(file_entry.path.clone()).is_err() {
self.text_messages.warnings.push(file_entry.path.display().to_string());
}
for (_, file_entry) in &self.big_files {
if fs::remove_file(file_entry.path.clone()).is_err() {
self.text_messages.warnings.push(file_entry.path.display().to_string());
}
}
}
@ -439,10 +465,8 @@ impl SaveResults for BigFile {
if self.information.number_of_real_files != 0 {
write!(writer, "{} the biggest files.\n\n", self.information.number_of_real_files).unwrap();
for (size, files) in self.big_files.iter().rev() {
for file_entry in files {
writeln!(writer, "{} ({}) - {}", size.file_size(options::BINARY).unwrap(), size, file_entry.path.display()).unwrap();
}
for (size, file_entry) in self.big_files.iter().rev() {
writeln!(writer, "{} ({}) - {}", size.file_size(options::BINARY).unwrap(), size, file_entry.path.display()).unwrap();
}
} else {
write!(writer, "Not found any files.").unwrap();
@ -455,11 +479,9 @@ impl SaveResults for BigFile {
impl PrintResults for BigFile {
fn print_results(&self) {
let start_time: SystemTime = SystemTime::now();
for (size, vector) in self.big_files.iter().rev() {
for (size, file_entry) in self.big_files.iter().rev() {
// TODO Align all to same width
for entry in vector {
println!("{} ({} bytes) - {}", size.file_size(options::BINARY).unwrap(), size, entry.path.display());
}
println!("{} ({} bytes) - {}", size.file_size(options::BINARY).unwrap(), size, file_entry.path.display());
}
Common::print_time(start_time, SystemTime::now(), "print_entries".to_string());
}

View file

@ -140,6 +140,14 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
Some(DynamicImage::ImageRgb8(image))
}
pub fn split_path(path: &Path) -> (String, String) {
match (path.parent(), path.file_name()) {
(Some(dir), Some(file)) => (dir.display().to_string(), file.to_string_lossy().into_owned()),
(Some(dir), None) => (dir.display().to_string(), String::new()),
(None, _) => (String::new(), String::new()),
}
}
impl Common {
/// Printing time which took between start and stop point and prints also function name
#[allow(unused_variables)]

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
Výchozí hodnota pro hash je 8 bajtů, což umožňuje najít velmi podobné i různé obrázky. 16 bajtů a 32 bajtových hashů by mělo být používáno pouze pro téměř totožné obrázky. 64 byte hash by neměl být použit, kromě situací, kdy je třeba najít opravdu malé rozdíly.
image_resize_filter_tooltip = Pro výpočet hash obrázku musí knihovna nejprve změnit velikost. V závislosti na zvoleném algoritmu bude výsledný obrázek vypadat málo jinak. Nejrychlejší algoritmus k používání, ale také ten, který dává nejhorší výsledky, je blízko.
image_hash_alg_tooltip = Uživatelé si mohou vybrat z jednoho z mnoha algoritmů pro výpočet hashu. Každý z nich má silné i slabší body a někdy přinese lepší a někdy horší výsledky pro různé obrázky. Takže pro určení nejlepšího pro vás je vyžadováno ruční testování.
big_files_mode_combobox_tooltip = Umožňuje vyhledávat malé / největší soubory
big_files_mode_label = Zaškrtnuté soubory
big_files_mode_smallest_combo_box = Nejmenší
big_files_mode_biggest_combo_box = Největší
main_notebook_image_fast_compare = Rychlé porovnání
main_notebook_image_fast_compare_tooltip =
Urychlit hledání a porovnávání hasičů.
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Zobrazit/skrýt spodní textový panel.
bottom_show_upper_notebook_tooltip = Zobrazit/skrýt horní panel sešitu.
# Progress Window
progress_stop_button = Zastavit
progress_stop_additional_message = Zastavit požadavek
# About Window
about_repository_button_tooltip = Odkaz na stránku repositáře se zdrojovým kódem.
about_donation_button_tooltip = Odkaz na stránku s darováním.

View file

@ -47,6 +47,10 @@ image_hash_size_tooltip =
Der Standardwert für die Hashlänge ist 8 Byte, was es ermöglicht sowohl sehr ähnliche Bilder als auch sehr unterschiedliche zu finden. 16 und 32 Byte sollten nur für nahezu identische Bilder verwendet werden, 64 Byte Hashlänge nur, um "mikroskopisch" kleine Unterschiede zu finden.
image_resize_filter_tooltip = Um den Hash des Bildes zu berechnen, muss die Bibliothek zuerst die Größe des Bildes verändern. Abhängig vom gewählten Algorithmus sieht das Ergebnis wenig anders aus. Der schnellste Algorithmus zu verwenden, aber auch einer, der die schlechtesten Ergebnisse gibt ist in der Nähe.
image_hash_alg_tooltip = Benutzer können einen von mehreren Algorithmen zur Berechnung des Hashes auswählen. Jeder hat sowohl Vor- als auch Nachteile und erzeugt manchmal bessere und manchmal schlechtere Ergebnisse für verschiedene Bilder. Um den besten für Sie auszuwählen, ist eine manuelle Prüfung erforderlich.
big_files_mode_combobox_tooltip = Erlaubt die Suche nach kleinsten/größten Dateien
big_files_mode_label = Überprüfte Dateien
big_files_mode_smallest_combo_box = Die kleinsten
big_files_mode_biggest_combo_box = Die Größten
main_notebook_image_fast_compare = Schneller Vergleich
main_notebook_image_fast_compare_tooltip =
Beschleunige die Suche und den Vergleich von Hashes.
@ -205,6 +209,7 @@ bottom_show_errors_tooltip = Ein-/Ausblenden des unteren Textfeldes.
bottom_show_upper_notebook_tooltip = Ein-/Ausblenden des oberen Notizbuch-Panels.
# Progress Window
progress_stop_button = Stoppen
progress_stop_additional_message = Stopp angefordert
# About Window
about_repository_button_tooltip = Link zur Repository-Seite mit Quellcode.
about_donation_button_tooltip = Link zur Spendenseite.

View file

@ -61,6 +61,11 @@ image_resize_filter_tooltip =
image_hash_alg_tooltip =
Users can choose from one of many algorithms of calculating the hash. Each has both strong and weaker points and will sometimes give better and sometimes worse results for different images. So, to determine the best one for you, manual testing is required.
big_files_mode_combobox_tooltip = Allows to search for smallest/biggest files
big_files_mode_label = Checked files
big_files_mode_smallest_combo_box = The Smallest
big_files_mode_biggest_combo_box = The Biggest
main_notebook_image_fast_compare = Fast compare
main_notebook_image_fast_compare_tooltip =
Speedup searching and comparing hashes.

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
El valor predeterminado para el hash es de 8 bytes, lo que permite encontrar imágenes muy similares y diferentes. El hash de 16 bytes y 32 bytes debe utilizarse sólo para imágenes casi idénticas. El hash de 64 bytes no debería ser usado, excepto en situaciones en las que necesita encontrar diferencias realmente pequeñas.
image_resize_filter_tooltip = Para calcular el hash de la imagen, la librería primero debe redimensionarla. Depende del algoritmo elegido, la imagen resultante se verá poco diferente. El algoritmo más rápido de usar, pero también uno que da los peores resultados es el más cercano.
image_hash_alg_tooltip = Los usuarios pueden elegir uno de los muchos algoritmos de cálculo del hash. Cada uno tiene puntos fuertes y débiles y a veces dará mejores y a veces peores resultados para diferentes imágenes. Por lo tanto, para determinar cuál es la mejor para usted, se requiere la prueba manual.
big_files_mode_combobox_tooltip = Permite buscar archivos más pequeños/mayores
big_files_mode_label = Archivos marcados
big_files_mode_smallest_combo_box = El más pequeño
big_files_mode_biggest_combo_box = El Bigote
main_notebook_image_fast_compare = Comparación rápida
main_notebook_image_fast_compare_tooltip =
Acelera la búsqueda y la comparación de hashes.
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Mostrar/Ocultar panel de texto inferior.
bottom_show_upper_notebook_tooltip = Mostrar / Ocultar panel de cuaderno superior.
# Progress Window
progress_stop_button = Parar
progress_stop_additional_message = Parar solicitado
# About Window
about_repository_button_tooltip = Enlace a la página del repositorio con código fuente.
about_donation_button_tooltip = Enlace a la página de donación.

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
La valeur par défaut pour le hachage est de 8 octets, ce qui permet de trouver des images très similaires et différentes. Les hashs 16 octets et 32 octets ne doivent être utilisés que pour des images presque identiques. Le hash de 64 octets ne devrait pas être utilisé, sauf situation où de petites différences sont nécessaires pour trouver.
image_resize_filter_tooltip = Pour calculer le hachage de l'image, la bibliothèque doit d'abord la redimensionner. En fonction de l'algorithme choisi, l'image résultée sera peu différente. L'algorithme le plus rapide à utiliser, mais aussi celui qui donne les pires résultats est Nearest.
image_hash_alg_tooltip = Les utilisateurs peuvent choisir un des nombreux algorithmes de calcul du hachage. Chacun a des points forts et des points faibles et donnera parfois de meilleurs résultats pour des images différentes, parfois pires, afin de choisir le meilleur, des tests manuels sont nécessaires.
big_files_mode_combobox_tooltip = Permet de rechercher les fichiers les plus petits ou les plus grands
big_files_mode_label = Fichiers cochés
big_files_mode_smallest_combo_box = Le plus petit
big_files_mode_biggest_combo_box = Le plus grand
main_notebook_image_fast_compare = Comparaison rapide
main_notebook_image_fast_compare_tooltip =
Accélère la recherche et la comparaison des haches.
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Afficher/Masquer le panneau de texte du bas.
bottom_show_upper_notebook_tooltip = Afficher/Masquer le panneau supérieur du bloc-notes.
# Progress Window
progress_stop_button = Arrêter
progress_stop_additional_message = Arrêt demandé
# About Window
about_repository_button_tooltip = Lien vers la page du dépôt avec le code source.
about_donation_button_tooltip = Lien vers la page des dons.

View file

@ -47,6 +47,10 @@ image_hash_size_tooltip =
Il valore predefinito per l'hash è di 8 byte, che permette di trovare immagini molto simili e diverse. Gli hash di 16 byte e 32 byte dovrebbero essere usati solo per immagini quasi identiche. L'hash da 64 byte non dovrebbe essere utilizzato, tranne nelle situazioni in cui è necessario trovare davvero piccole differenze.
image_resize_filter_tooltip = Per processare l'hash di un'immagine, la libreria deve prima ridimensionarla. In funzione del metodo scelto, l'immagine risultante apparirà leggermente diversa. Il metodo più veloce, ma anche quello che dà i peggiori risultati, è Nearest.
image_hash_alg_tooltip = Gli utenti possono scegliere tra uno dei molti algoritmi di calcolo dell'hash. Ognuno ha punti forti e più deboli e a volte darà risultati migliori e a volte peggiori per immagini diverse. Quindi, per determinare quello migliore per voi, test manuali è richiesto.
big_files_mode_combobox_tooltip = Consente di cercare file più piccoli/più grandi
big_files_mode_label = File controllati
big_files_mode_smallest_combo_box = Il Più Piccolo
big_files_mode_biggest_combo_box = Il Più Grande
main_notebook_image_fast_compare = Confronto veloce
main_notebook_image_fast_compare_tooltip =
Accelerare la ricerca e confrontare hash.
@ -205,6 +209,7 @@ bottom_show_errors_tooltip = Mostra/Nasconde il pannello di testo inferiore.
bottom_show_upper_notebook_tooltip = Mostra/Nasconde il pannello comandi.
# Progress Window
progress_stop_button = Ferma
progress_stop_additional_message = Interrompi richiesta
# About Window
about_repository_button_tooltip = Link alla pagina del repository con il codice sorgente.
about_donation_button_tooltip = Link alla pagina della donazione.

View file

@ -11,7 +11,7 @@ music_title_checkbox = タイトル
music_artist_checkbox = アーティスト
music_year_checkbox = 年
music_bitrate_checkbox = ビットレート
music_genre_checkbox = Genre
music_genre_checkbox = ジャンル
music_length_checkbox = 長さ
music_comparison_checkbox = おおよその比較
music_comparison_checkbox_tooltip =
@ -48,6 +48,10 @@ image_hash_size_tooltip =
ハッシュ値のデフォルトの大きさは8バイトで、非常に類似した異なる画像を見つけることができます。 16バイトと32バイトのハッシュは、ほぼ同じ画像にのみ使用する必要があります。 本当に小さな違いを見つける必要がある状況を除いて、64 バイトのハッシュは使用するべきではありません。
image_resize_filter_tooltip = 画像のハッシュを計算するには、ライブラリはまず画像のサイズを変更する必要があります。選択されたアルゴリズムによって、結果の画像はほとんど異なります。 最速のアルゴリズムであり、かつ最も悪い結果をもたらすアルゴリズムはNearestです。
image_hash_alg_tooltip = ユーザーは多くのハッシュ方式から1つを選択することができます。 それぞれが長所と短所の両方を持っており、時には異なる画像に対してより良い結果や悪い結果を与えます。 あなたにとって最良のものを選ぶには、それらを自分自身で試す必要があります。
big_files_mode_combobox_tooltip = 最小/最大のファイルを検索できます
big_files_mode_label = チェックされたファイル
big_files_mode_smallest_combo_box = 最も小さい
big_files_mode_biggest_combo_box = 最大のもの
main_notebook_image_fast_compare = 高速な比較
main_notebook_image_fast_compare_tooltip =
ハッシュの検索・比較を高速化します。
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = 下部のエラーパネルを表示/非表示に
bottom_show_upper_notebook_tooltip = 上部のノートブックパネルを表示/非表示にします。
# Progress Window
progress_stop_button = 停止
progress_stop_additional_message = リクエストを停止する
# About Window
about_repository_button_tooltip = ソースコードのあるリポジトリページへのリンク
about_donation_button_tooltip = 寄付ページへのリンク

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
Standardverdi for hash er 8 byte, noe som tillater å finne både svært like og forskjellige bilder. 16 byte og 32 byte hashes skal bare brukes ved nesten identiske bilder. 64 byte hash skal ikke brukes, unntatt i situasjoner hvor du må finne veldig små forskjeller.
image_resize_filter_tooltip = For å beregne hash med bilde må biblioteket først endre størrelsen på det. Avhengig av valgt algoritme, resulterte i et bilde vil se lite annet ut. Den raskeste algoritmen å bruke, men også den som gir de verste resultatene, er Nearest.
image_hash_alg_tooltip = Brukere kan velge mellom en av mange algoritmer i beregningen av hashen. Hver har både sterke og svakere poeng, og vil i noen tilfeller gi bedre og noen ganger verre resultater for ulike bilder. Derfor er det nødvendig med manuell testing for å bestemme det beste for deg.
big_files_mode_combobox_tooltip = Lar deg søke etter minste/største filer
big_files_mode_label = Avmerkede filer
big_files_mode_smallest_combo_box = Den minste
big_files_mode_biggest_combo_box = Den største
main_notebook_image_fast_compare = Rask sammenligning
main_notebook_image_fast_compare_tooltip =
Speedup søk og sammenligner hashes.
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Vis/Skjul bunntekstpanelet.
bottom_show_upper_notebook_tooltip = Vis/Skjul øvre notebook panel.
# Progress Window
progress_stop_button = Stopp
progress_stop_additional_message = Stopp forespurt
# About Window
about_repository_button_tooltip = Link til pakkesiden med kildekoden.
about_donation_button_tooltip = Lenke til donasjonssiden.

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
Domyślna wartość 8 bajtów jest dla znacznej większości przypadków wystarczająca, dlatego jest opcją domyslną, jednak w razie konieczności znalezienia identycznych obrazów z jeszcze większą dokładnością, należy użyć większego haszu.
image_resize_filter_tooltip = By obliczyć hash obrazu, biblioteka musi najpierw go zmniejszyć. W zależności od wybranego algorytmu, obraz będzie wyglądał nieco inaczej. Najszybszym, lecz za razem dającym najgorsze efekty jest algorytm Nearest.
image_hash_alg_tooltip = Użytkownicy mogą wybrać jeden z wielu algorytmów obliczania haszu. Każda z nich ma zarówno silne jak i słabsze punkty i czasami przyniesie lepsze i czasami gorsze wyniki w odniesieniu do różnych obrazów. W związku z tym, aby określić najlepszy dla siebie, wymagane jest ręczne testowanie każdego z nich.
big_files_mode_combobox_tooltip = Pozwala na wyszukiwanie najmniejszych lub największych plików
big_files_mode_label = Sprawdzane pliki
big_files_mode_smallest_combo_box = Najmniejsze
big_files_mode_biggest_combo_box = Największe
main_notebook_image_fast_compare = Szybkie porównywanie
main_notebook_image_fast_compare_tooltip =
Przyśpieszenie wyszukiwania i porównywania hashów.
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Pokaż/Ukryj dolny panel tekstowy.
bottom_show_upper_notebook_tooltip = Pokazuje/ukrywa górny panel.
# Progress Window
progress_stop_button = Stop
progress_stop_additional_message = Przerywanie skanowania
# About Window
about_repository_button_tooltip = Link do repozytorium z kodem źródłowym
about_donation_button_tooltip = Link do strony z dotacjami.

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
O valor padrão para hash é 8 bytes, o que permite encontrar imagens muito semelhantes e diferentes. 16 bytes e 32 bytes de hashes devem ser usados apenas para imagens quase idênticas. O hash de 64 bytes não deve ser usado, exceto em situações em que você precisa encontrar diferenças realmente pequenas.
image_resize_filter_tooltip = Para calcular o hash de imagem, a biblioteca deve primeiro redimensioná-la. Depende no algoritmo escolhido, a imagem resultante parecerá pouco diferente. O algoritmo mais rápido para usar, mas também aquele que dá os piores resultados é mais rápido.
image_hash_alg_tooltip = Os usuários podem escolher entre muitos algoritmos para calcular o hash. Cada um tem pontos fortes e fracos e, às vezes, dá resultados melhores e por vezes piores para diferentes imagens. Então, para determinar a melhor para você, testes manuais são necessários.
big_files_mode_combobox_tooltip = Permite a busca de arquivos menores/maiores
big_files_mode_label = Arquivos verificados
big_files_mode_smallest_combo_box = O Menor
big_files_mode_biggest_combo_box = O Maior
main_notebook_image_fast_compare = Comparação rápida
main_notebook_image_fast_compare_tooltip =
Acelerar busca e comparação de hashes.
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Mostrar/ocultar painel de texto inferior.
bottom_show_upper_notebook_tooltip = Mostrar/ocultar painel superior do caderno.
# Progress Window
progress_stop_button = Interromper
progress_stop_additional_message = Parar pedido
# About Window
about_repository_button_tooltip = Link para a página do repositório com o código-fonte.
about_donation_button_tooltip = Link para a página de doação.

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
Размер хэша по умолчанию — 8 байт, что позволяет найти и похожие, и слегка различающиеся изображения. 16 и 32 байт хэша следует использовать для обнаружения почти одинаковых изображений. Хэш размером 64 байт должен использоваться лишь в тех случаях, когда необходимо отфильтровать только изображения с микроскопическими различиями.
image_resize_filter_tooltip = Чтобы вычислить хэш изображения, библиотека должна сначала его перемасштабировать. В зависимости от выбранного алгоритма получившееся изображение может выглядеть немного по-разному. Метод ближайших соседей самый быстрый, но даёт худшие результаты.
image_hash_alg_tooltip = Пользователи могут выбрать один из множества алгоритмов вычисления хэша. Каждый из них имеет как сильные, так и слабые стороны и иногда даёт лучшие или худшие результаты для разных изображений. Для получения наилучших результатов следует протестировать алгоритмы вручную.
big_files_mode_combobox_tooltip = Поиск наименьших/наибольших файлов
big_files_mode_label = Проверенные файлы
big_files_mode_smallest_combo_box = Самый маленький
big_files_mode_biggest_combo_box = Крупнейший
main_notebook_image_fast_compare = Быстрое сравнение
main_notebook_image_fast_compare_tooltip =
Ускорение поиска и сравнения хэшей.
@ -71,7 +75,7 @@ main_tree_view_column_folder_name = Имя папки
main_tree_view_column_path = Путь
main_tree_view_column_modification = Дата изменения
main_tree_view_column_size = Размер
main_tree_view_column_similarity = Схожесть
main_tree_view_column_similarity = Сходство
main_tree_view_column_dimensions = Размеры
main_tree_view_column_title = Заголовок
main_tree_view_column_artist = Исполнитель
@ -92,17 +96,17 @@ main_label_size_bytes = Размер (байт)
main_label_min_size = Мин
main_label_max_size = Макс
main_label_shown_files = Количество отображаемых файлов
main_label_resize_algorithm = Алгоритм перемасштабирования
main_label_resize_algorithm = Алгоритм масштабирования
main_label_similarity = Сходство{" "}
check_button_general_same_size = Игнорировать одинаковый размер
check_button_general_same_size_tooltip = Игнорировать в результатах файлы, имеющие одинаковый размер: обычно это точные дубликаты
main_label_size_bytes_tooltip = Размер файлов, которые будут просканированы
# Upper window
upper_tree_view_included_folder_column_title = Папки для поиска
upper_tree_view_included_reference_column_title = Папки подлинников
upper_recursive_button = Рекурсивный
upper_tree_view_included_reference_column_title = Содержит оригиналы
upper_recursive_button = В подпапках
upper_recursive_button_tooltip = При включённой опции будут также искаться файлы, не находящиеся непосредственно в корне выбранной папки, т. е. в других подпапках данной папки и их подпапках.
upper_manual_add_included_button = Добавить вручную
upper_manual_add_included_button = Прописать вручную
upper_add_included_button = Добавить
upper_remove_included_button = Удалить
upper_manual_add_excluded_button = Ручное добавление
@ -114,7 +118,7 @@ upper_remove_included_button_tooltip = Исключить каталог из п
upper_manual_add_excluded_button_tooltip = Добавить вручную имя каталога, исключаемого из поиска.
upper_add_excluded_button_tooltip = Добавить каталог, исключаемый из поиска.
upper_remove_excluded_button_tooltip = Убрать каталог из исключенных.
upper_notebook_items_configuration = Конфигурация элементов
upper_notebook_items_configuration = Параметры поиска
upper_notebook_excluded_directories = Исключённые каталоги
upper_notebook_included_directories = Включённые каталоги
upper_allowed_extensions_tooltip =
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Показать/скрыть нижнюю текс
bottom_show_upper_notebook_tooltip = Показать/скрыть верхнюю панель блокнота.
# Progress Window
progress_stop_button = Остановить
progress_stop_additional_message = Стоп запрошен
# About Window
about_repository_button_tooltip = Ссылка на страницу репозитория с исходным кодом.
about_donation_button_tooltip = Ссылка на страницу пожертвований.

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
Розмір хеша за замовчуванням — 8 байт, що дозволяє знайти і схожі, і злегка різні зображення. 16 та 32 байт хешу слід використовувати для виявлення майже однакових зображень. Хеш розміром 64 байт повинен використовуватися лише у випадках, коли необхідно відфільтрувати лише зображення з мікроскопічними відмінностями.
image_resize_filter_tooltip = Щоб обчислити хеш зображення, бібліотека має спочатку його перемасштабувати. Залежно від обраного алгоритму зображення може виглядати трохи по-різному. Метод найближчих сусідів найшвидший, але дає найгірші результати.
image_hash_alg_tooltip = Користувачі можуть вибирати один з багатьох алгоритмів обчислення. Кожен має сильні та слабкі точки, і іноді дасть кращі результати для різних зображень. Таким чином, щоб обрати найкраще, необхідно ручне тестування.
big_files_mode_combobox_tooltip = Дозволяє шукати найменші або найбільші файли
big_files_mode_label = Перевірені файли
big_files_mode_smallest_combo_box = Найменший
big_files_mode_biggest_combo_box = Найбільший
main_notebook_image_fast_compare = Швидко порівняти
main_notebook_image_fast_compare_tooltip =
Прискорення пошуку та порівняння хешів.
@ -92,17 +96,17 @@ main_label_size_bytes = Розмір (байт)
main_label_min_size = Мін
main_label_max_size = Макс
main_label_shown_files = Кількість показаних файлів
main_label_resize_algorithm = Алгоритм перемасштабування
main_label_similarity = Подібність{ " " }
main_label_resize_algorithm = Алгоритм масштабування
main_label_similarity = Подібність{ " " }
check_button_general_same_size = Ігнорувати однаковий розмір
check_button_general_same_size_tooltip = Ігнорувати в результатах файли, що мають однаковий розмір: зазвичай це точні дублікати
main_label_size_bytes_tooltip = Розмір файлів, які будуть проскановані
# Upper window
upper_tree_view_included_folder_column_title = Папки для пошуку
upper_tree_view_included_reference_column_title = Папки оригіналів
upper_tree_view_included_reference_column_title = Містить оригінали
upper_recursive_button = Рекурсивний
upper_recursive_button_tooltip = Коли увімкнено, будуть шукатися файли, що не знаходяться безпосередньо в корені вибраної папки, тобто в інших підпапках даної папки та їх підпапках.
upper_manual_add_included_button = Додати вручну
upper_manual_add_included_button = Прописати вручну
upper_add_included_button = Додати
upper_remove_included_button = Видалити
upper_manual_add_excluded_button = Ручне додавання
@ -114,7 +118,7 @@ upper_remove_included_button_tooltip = Видалити директорію з
upper_manual_add_excluded_button_tooltip = Додати вручну ім'я каталогу, який виключається з пошуку.
upper_add_excluded_button_tooltip = Додати каталог, який виключається з пошуку.
upper_remove_excluded_button_tooltip = Видалити каталог з виключених.
upper_notebook_items_configuration = Налаштування елементів
upper_notebook_items_configuration = Параметри пошуку
upper_notebook_excluded_directories = Виключені каталоги
upper_notebook_included_directories = Включені каталоги
upper_allowed_extensions_tooltip =
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = Показати/приховати нижню те
bottom_show_upper_notebook_tooltip = Показати/приховати верхню панель блокнота.
# Progress Window
progress_stop_button = Зупинити
progress_stop_additional_message = Припинити запит
# About Window
about_repository_button_tooltip = Посилання на сторінку репозиторію з вихідним кодом.
about_donation_button_tooltip = Посилання на сторінку пожертви.
@ -243,7 +248,7 @@ settings_confirm_deletion_button = Показувати вікно підтве
settings_confirm_link_button = Показувати вікно підтвердження при складній/символьних посилань будь-які файли
settings_confirm_group_deletion_button = Показувати вікно підтвердження при видаленні всіх файлів групи
settings_show_text_view_button = Показувати нижню текстову панель
settings_use_cache_button = Використання кешу
settings_use_cache_button = Використовувати кеш
settings_save_also_as_json_button = Також зберегти кеш у файл JSON
settings_use_trash_button = Перемістити видалені файли в смітник
settings_language_label = Мова

View file

@ -48,6 +48,10 @@ image_hash_size_tooltip =
散列的默认值为8字节这样可以找到非常相似和不同的图像。 16 字节和32 字节哈希值只能用于几乎完全相同的图像。 64 字节散列不应使用,除非您需要找到真正小的差异。
image_resize_filter_tooltip = 要计算图像散列,库必须首先调整大小。在选定的算法上停用,结果图像看起来没有什么不同。 使用最快的算法但结果最差的算法是Nearest。
image_hash_alg_tooltip = 用户可以从计算哈希的许多算法中选择一个。 每一个国家都有强大和弱点,有时会给不同的形象带来更好、有时甚至更糟的结果。 因此,为了确定您最好的测试,需要手动测试。
big_files_mode_combobox_tooltip = 允许搜索最小/最大的文件
big_files_mode_label = 已检查的文件
big_files_mode_smallest_combo_box = 最小的
big_files_mode_biggest_combo_box = 最大的
main_notebook_image_fast_compare = 快速比较
main_notebook_image_fast_compare_tooltip =
加快搜索和比较哈希。
@ -206,6 +210,7 @@ bottom_show_errors_tooltip = 显示/隐藏底部文本面板。
bottom_show_upper_notebook_tooltip = 显示/隐藏主笔记本面板。
# Progress Window
progress_stop_button = 停止
progress_stop_additional_message = 停止请求
# About Window
about_repository_button_tooltip = 链接到源代码的仓库页面。
about_donation_button_tooltip = 链接到捐赠页面。

View file

@ -8,6 +8,7 @@ use glib::Receiver;
use gtk4::prelude::*;
use humansize::{file_size_opts as options, FileSize};
use czkawka_core::common::split_path;
use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::localizer_core::generate_translation_hashmap;
use czkawka_core::same_music::MusicSimilarity;
@ -677,30 +678,23 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
{
let list_store = get_list_store(&tree_view_big_files_finder);
let btreemap = bf.get_big_files();
let vector = bf.get_big_files();
for (size, vector) in btreemap.iter().rev() {
let mut vector = vector.clone();
vector.sort_by_key(|e| {
let t = split_path(e.path.as_path());
(t.0, t.1)
});
for file_entry in vector {
let (directory, file) = split_path(&file_entry.path);
let values: [(u32, &dyn ToValue); 7] = [
(ColumnsBigFiles::SelectionButton as u32, &false),
(ColumnsBigFiles::Size as u32, &(size.file_size(options::BINARY).unwrap())),
(ColumnsBigFiles::Name as u32, &file),
(ColumnsBigFiles::Path as u32, &directory),
(
ColumnsBigFiles::Modification as u32,
&(NaiveDateTime::from_timestamp(file_entry.modified_date as i64, 0).to_string()),
),
(ColumnsBigFiles::ModificationAsSecs as u32, &(file_entry.modified_date as i64)),
(ColumnsBigFiles::SizeAsBytes as u32, &(size)),
];
list_store.set(&list_store.append(), &values);
}
for (size, file_entry) in vector.iter() {
let (directory, file) = split_path(&file_entry.path);
let values: [(u32, &dyn ToValue); 7] = [
(ColumnsBigFiles::SelectionButton as u32, &false),
(ColumnsBigFiles::Size as u32, &(size.file_size(options::BINARY).unwrap())),
(ColumnsBigFiles::Name as u32, &file),
(ColumnsBigFiles::Path as u32, &directory),
(
ColumnsBigFiles::Modification as u32,
&(NaiveDateTime::from_timestamp(file_entry.modified_date as i64, 0).to_string()),
),
(ColumnsBigFiles::ModificationAsSecs as u32, &(file_entry.modified_date as i64)),
(ColumnsBigFiles::SizeAsBytes as u32, &(size)),
];
list_store.set(&list_store.append(), &values);
}
print_text_messages_to_text_view(text_messages, &text_view_errors);
}

View file

@ -21,7 +21,8 @@ use czkawka_core::*;
use crate::gui_structs::gui_data::GuiData;
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,
BIG_FILES_CHECK_METHOD_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,
};
use crate::help_functions::*;
use crate::notebook_enums::*;
@ -49,6 +50,7 @@ pub fn connect_button_search(
let combo_box_image_resize_algorithm = gui_data.main_notebook.combo_box_image_resize_algorithm.clone();
let combo_box_duplicate_check_method = gui_data.main_notebook.combo_box_duplicate_check_method.clone();
let combo_box_duplicate_hash_type = gui_data.main_notebook.combo_box_duplicate_hash_type.clone();
let combo_box_big_files_mode = gui_data.main_notebook.combo_box_big_files_mode.clone();
let buttons_array = gui_data.bottom_buttons.buttons_array.clone();
let check_button_image_ignore_same_size = gui_data.main_notebook.check_button_image_ignore_same_size.clone();
let check_button_video_ignore_same_size = gui_data.main_notebook.check_button_video_ignore_same_size.clone();
@ -259,6 +261,9 @@ pub fn connect_button_search(
get_list_store(&tree_view_big_files_finder).clear();
let big_files_mode_index = combo_box_big_files_mode.active().unwrap() as usize;
let big_files_mode = BIG_FILES_CHECK_METHOD_COMBO_BOX[big_files_mode_index].check_method;
let numbers_of_files_to_check = entry_big_files_number.text().as_str().parse::<usize>().unwrap_or(50);
let futures_sender_big_file = futures_sender_big_file.clone();
@ -272,6 +277,7 @@ pub fn connect_button_search(
bf.set_excluded_items(excluded_items);
bf.set_allowed_extensions(allowed_extensions);
bf.set_number_of_files_to_check(numbers_of_files_to_check);
bf.set_search_mode(big_files_mode);
bf.find_big_files(Some(&stop_receiver), Some(&futures_sender_big_file));
let _ = glib_stop_sender.send(Message::BigFiles(bf));
});

View file

@ -1,7 +1,7 @@
use gtk4::prelude::*;
use gtk4::{GestureClick, Widget};
use crate::help_functions::{get_custom_label_from_widget, get_custom_label_with_name_from_widget, set_icon_of_button, BottomButtonsEnum};
use crate::help_functions::{get_custom_label_from_widget, set_icon_of_button, BottomButtonsEnum};
use crate::{
flg, CZK_ICON_COMPARE, CZK_ICON_HARDLINK, CZK_ICON_HIDE_DOWN, CZK_ICON_HIDE_UP, CZK_ICON_MOVE, CZK_ICON_SAVE, CZK_ICON_SEARCH, CZK_ICON_SELECT, CZK_ICON_SYMLINK,
CZK_ICON_TRASH,
@ -20,6 +20,8 @@ pub struct GuiBottomButtons {
pub buttons_show_errors: gtk4::Button,
pub buttons_show_upper_notebook: gtk4::Button,
pub label_buttons_select: gtk4::Label,
pub buttons_names: [BottomButtonsEnum; 8],
pub buttons_array: [Widget; 8],
@ -40,6 +42,8 @@ impl GuiBottomButtons {
let buttons_show_errors: gtk4::Button = builder.object("buttons_show_errors").unwrap();
let buttons_show_upper_notebook: gtk4::Button = builder.object("buttons_show_upper_notebook").unwrap();
let label_buttons_select: gtk4::Label = builder.object("label_buttons_select").unwrap();
let gc_buttons_select: GestureClick = GestureClick::new();
buttons_select.add_controller(&gc_buttons_select);
@ -89,6 +93,7 @@ impl GuiBottomButtons {
buttons_compare,
buttons_show_errors,
buttons_show_upper_notebook,
label_buttons_select,
buttons_names,
buttons_array,
gc_buttons_select,
@ -96,7 +101,7 @@ impl GuiBottomButtons {
}
pub fn update_language(&self) {
get_custom_label_from_widget(&self.buttons_search.clone()).set_text(&flg!("bottom_search_button"));
get_custom_label_with_name_from_widget(&self.buttons_select.clone(), "SelectMenu").set_text(&flg!("bottom_select_button"));
self.label_buttons_select.set_text(&flg!("bottom_select_button"));
get_custom_label_from_widget(&self.buttons_delete.clone()).set_text(&flg!("bottom_delete_button"));
get_custom_label_from_widget(&self.buttons_save.clone()).set_text(&flg!("bottom_save_button"));
get_custom_label_from_widget(&self.buttons_symlink.clone()).set_text(&flg!("bottom_symlink_button"));

View file

@ -1,3 +1,4 @@
use czkawka_core::big_file::SearchMode;
use gtk4::prelude::*;
use gtk4::{Builder, CheckButton, ComboBoxText, Entry, EventControllerKey, GestureClick, Image, Label, Notebook, Scale, ScrolledWindow, TreeView, Widget};
@ -6,7 +7,7 @@ use czkawka_core::localizer_core::{fnc_get_similarity_minimal, fnc_get_similarit
use czkawka_core::similar_images::{get_string_from_similarity, Similarity, SIMILAR_VALUES};
use crate::flg;
use crate::help_combo_box::{DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX};
use crate::help_combo_box::{BIG_FILES_CHECK_METHOD_COMBO_BOX, DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX};
use crate::help_functions::get_all_children;
use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
@ -76,6 +77,8 @@ pub struct GuiMainNotebook {
// Big file
pub label_big_shown_files: Label,
pub entry_big_files_number: Entry,
pub label_big_files_mode: Label,
pub combo_box_big_files_mode: ComboBoxText,
// Similar Images
pub scale_similarity_similar_images: Scale,
@ -206,8 +209,6 @@ impl GuiMainNotebook {
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: Scale = builder.object("scale_similarity_similar_images").unwrap();
let scale_similarity_similar_videos: Scale = builder.object("scale_similarity_similar_videos").unwrap();
@ -216,6 +217,7 @@ impl GuiMainNotebook {
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 combo_box_big_files_mode: ComboBoxText = builder.object("combo_box_big_files_mode").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();
@ -233,6 +235,7 @@ impl GuiMainNotebook {
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 label_big_files_mode: Label = builder.object("label_big_files_mode").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();
@ -316,6 +319,8 @@ impl GuiMainNotebook {
gc_tree_view_invalid_symlinks,
gc_tree_view_broken_files,
gc_tree_view_bad_extensions,
combo_box_big_files_mode,
label_big_files_mode,
}
}
@ -376,6 +381,10 @@ impl GuiMainNotebook {
self.combo_box_image_hash_algorithm.set_tooltip_text(Some(&flg!("image_hash_alg_tooltip")));
self.label_image_hash_type.set_tooltip_text(Some(&flg!("image_hash_alg_tooltip")));
self.combo_box_big_files_mode.set_tooltip_text(Some(&flg!("big_files_mode_combobox_tooltip")));
self.label_big_files_mode.set_tooltip_text(Some(&flg!("big_files_mode_combobox_tooltip")));
self.label_big_files_mode.set_label(&flg!("big_files_mode_label"));
self.check_button_image_ignore_same_size
.set_tooltip_text(Some(&flg!("check_button_general_same_size_tooltip")));
self.check_button_video_ignore_same_size
@ -538,5 +547,17 @@ impl GuiMainNotebook {
}
self.combo_box_duplicate_check_method.set_active(Some(active));
}
{
let active = self.combo_box_big_files_mode.active().unwrap_or(0);
self.combo_box_big_files_mode.remove_all();
for i in &BIG_FILES_CHECK_METHOD_COMBO_BOX {
let text = match i.check_method {
SearchMode::SmallestFiles => flg!("big_files_mode_smallest_combo_box"),
SearchMode::BiggestFiles => flg!("big_files_mode_biggest_combo_box"),
};
self.combo_box_big_files_mode.append_text(&text);
}
self.combo_box_big_files_mode.set_active(Some(active));
}
}
}

View file

@ -1,3 +1,4 @@
use czkawka_core::big_file::SearchMode;
use image_hasher::{FilterType, HashAlg};
use czkawka_core::common_dir_traversal::CheckingMethod;
@ -43,6 +44,23 @@ pub const DUPLICATES_CHECK_METHOD_COMBO_BOX: [CheckMethodStruct; 3] = [
},
];
#[derive(Copy, Clone)]
pub struct SearchModeStruct {
pub eng_name: &'static str,
pub check_method: SearchMode,
}
pub const BIG_FILES_CHECK_METHOD_COMBO_BOX: [SearchModeStruct; 2] = [
SearchModeStruct {
eng_name: "Biggest",
check_method: SearchMode::BiggestFiles,
},
SearchModeStruct {
eng_name: "Smallest",
check_method: SearchMode::SmallestFiles,
},
];
pub struct ImageResizeAlgStruct {
pub eng_name: &'static str,
pub filter: FilterType,

View file

@ -1,6 +1,6 @@
use std::cmp::Ordering;
use std::collections::HashMap;
use std::path::{Path, PathBuf};
use std::path::PathBuf;
use gdk4::gdk_pixbuf::{InterpType, Pixbuf};
use gtk4::prelude::*;
@ -412,14 +412,6 @@ pub fn get_path_buf_from_vector_of_strings(vec_string: Vec<String>) -> Vec<PathB
vec_string.iter().map(PathBuf::from).collect()
}
pub fn split_path(path: &Path) -> (String, String) {
match (path.parent(), path.file_name()) {
(Some(dir), Some(file)) => (dir.display().to_string(), file.to_string_lossy().into_owned()),
(Some(dir), None) => (dir.display().to_string(), String::new()),
(None, _) => (String::new(), String::new()),
}
}
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() {
@ -798,21 +790,6 @@ pub fn get_custom_label_from_widget<P: IsA<Widget>>(item: &P) -> gtk4::Label {
panic!("Button doesn't have proper custom label child");
}
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>() {
if name == label.text().as_str() {
return label;
}
} else {
widgets_to_check.extend(get_all_children(&widget));
}
}
panic!("Button doesn't have proper custom label child");
}
pub fn get_custom_image_from_widget<P: IsA<Widget>>(item: &P) -> gtk4::Image {
let mut widgets_to_check = vec![item.clone().upcast::<Widget>()];

View file

@ -419,6 +419,7 @@ enum LoadText {
ComboBoxImageResizeAlgorithm,
ComboBoxImageHashType,
ComboBoxImageHashSize,
ComboBoxBigFiles,
NumberOfBiggestFiles,
SimilarImagesSimilarity,
SimilarImagesIgnoreSameSize,
@ -468,6 +469,7 @@ fn create_hash_map() -> (HashMap<LoadText, String>, HashMap<String, LoadText>) {
(LoadText::SimilarVideosIgnoreSameSize, "similar_videos_ignore_same_size"),
(LoadText::MusicApproximateComparison, "music_approximate_comparison"),
(LoadText::DuplicateNameCaseSensitive, "duplicate_name_case_sensitive"),
(LoadText::ComboBoxBigFiles, "combo_box_big_files_mode"),
];
let mut hashmap_ls: HashMap<LoadText, String> = Default::default();
let mut hashmap_sl: HashMap<String, LoadText> = Default::default();
@ -617,6 +619,10 @@ pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb
hashmap_ls.get(&LoadText::ComboBoxImageHashSize).unwrap().to_string(),
main_notebook.combo_box_image_hash_size.active().unwrap_or(0),
);
saving_struct.save_var(
hashmap_ls.get(&LoadText::ComboBoxBigFiles).unwrap().to_string(),
main_notebook.combo_box_big_files_mode.active().unwrap_or(0),
);
// Other2
saving_struct.save_var(
@ -729,6 +735,7 @@ pub fn load_configuration(
let combo_box_image_hash_size = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxImageHashSize).unwrap().clone(), 0);
let combo_box_image_hash_algorithm = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxImageHashType).unwrap().clone(), 0);
let combo_box_image_resize_algorithm = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxImageResizeAlgorithm).unwrap().clone(), 0);
let combo_box_big_files_mode = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxBigFiles).unwrap().clone(), 0);
let number_of_biggest_files = loaded_entries.get_integer_string(
hashmap_ls.get(&LoadText::NumberOfBiggestFiles).unwrap().clone(),
@ -865,6 +872,7 @@ pub fn load_configuration(
save_proper_value_to_combo_box(&main_notebook.combo_box_image_hash_algorithm, combo_box_image_hash_algorithm);
save_proper_value_to_combo_box(&main_notebook.combo_box_image_hash_size, combo_box_image_hash_size);
save_proper_value_to_combo_box(&main_notebook.combo_box_image_resize_algorithm, combo_box_image_resize_algorithm);
save_proper_value_to_combo_box(&main_notebook.combo_box_big_files_mode, combo_box_big_files_mode);
main_notebook.check_button_duplicate_case_sensitive_name.set_active(check_button_case_sensitive_name);
main_notebook.entry_big_files_number.set_text(&number_of_biggest_files);
@ -995,6 +1003,7 @@ pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNoteb
main_notebook.combo_box_image_hash_algorithm.set_active(Some(0));
main_notebook.combo_box_image_resize_algorithm.set_active(Some(0));
main_notebook.combo_box_image_hash_size.set_active(Some(0));
main_notebook.combo_box_big_files_mode.set_active(Some(0));
main_notebook.scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[0][5] as f64); // DEFAULT FOR MAX of 8
main_notebook.scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[0][5] as f64);

View file

@ -110,8 +110,8 @@
(5,72,"GtkNotebookPage",None,56,None,None,None,2),
(5,73,"GtkBox",None,72,None,None,None,None),
(5,74,"GtkBox",None,73,None,None,None,None),
(5,75,"GtkLabel","label_big_shown_files",74,None,None,None,None),
(5,76,"GtkEntry","entry_big_files_number",74,None,None,None,1),
(5,75,"GtkLabel","label_big_shown_files",74,None,None,None,2),
(5,76,"GtkEntry","entry_big_files_number",74,None,None,None,3),
(5,77,"GtkScrolledWindow","scrolled_window_big_files_finder",73,None,None,None,1),
(5,78,"GtkLabel",None,72,None,None,None,None),
(5,79,"GtkNotebookPage",None,56,None,None,None,3),
@ -194,7 +194,7 @@
(5,189,"GtkMenuButton","buttons_select",188,None,None,None,None),
(5,190,"GtkBox",None,189,None,None,None,None),
(5,191,"GtkImage",None,190,None,None,None,None),
(5,192,"GtkLabel",None,190,None,None,None,1),
(5,192,"GtkLabel","label_buttons_select",190,None,None,None,1),
(5,193,"GtkButton","buttons_compare",188,None,None,None,1),
(5,194,"GtkBox",None,193,None,None,None,None),
(5,195,"GtkImage",None,194,None,None,None,None),
@ -223,6 +223,8 @@
(5,218,"GtkImage",None,217,None,None,None,None),
(5,219,"GtkButton","buttons_show_upper_notebook",187,None,None,None,3),
(5,220,"GtkImage",None,219,None,None,None,None),
(5,221,"GtkComboBoxText","combo_box_big_files_mode",74,None,None,None,1),
(5,222,"GtkLabel","label_big_files_mode",74,None,None,None,None),
(6,1,"GtkPopover","popover_right_click",None,None,None,None,None),
(6,2,"GtkBox",None,1,None,None,None,None),
(6,3,"GtkButton","buttons_popover_right_click_open_file",2,None,None,None,None),
@ -724,6 +726,7 @@
(5,219,"GtkWidget","receives-default","1",None,None,None,None,None),
(5,220,"GtkImage","icon-name","image-missing",None,None,None,None,None),
(5,220,"GtkWidget","halign","center",None,None,None,None,None),
(5,222,"GtkLabel","label","VVV",None,None,None,None,None),
(6,1,"GtkPopover","child",None,None,None,None,None,2),
(6,1,"GtkPopover","position","left",None,None,None,None,None),
(6,2,"GtkOrientable","orientation","vertical",None,None,None,None,None),

View file

@ -423,6 +423,14 @@
<property name="margin-start">5</property>
<property name="margin-top">2</property>
<property name="spacing">8</property>
<child>
<object class="GtkLabel" id="label_big_files_mode">
<property name="label">VVV</property>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="combo_box_big_files_mode"/>
</child>
<child>
<object class="GtkLabel" id="label_big_shown_files">
<property name="label" translatable="yes">Number of shown files</property>
@ -857,7 +865,7 @@
</object>
</child>
<child>
<object class="GtkLabel">
<object class="GtkLabel" id="label_buttons_select">
<property name="label">SelectMenu</property>
</object>
</child>

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>