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

Case insensitive name checking (#669)

* Case insensitive checking in name duplicates

* Hide instead disable
This commit is contained in:
Rafał Mikrut 2022-04-10 11:59:41 +02:00 committed by GitHub
parent 12a873ff66
commit aa07d73bca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 117 additions and 50 deletions

48
Cargo.lock generated
View file

@ -646,9 +646,9 @@ dependencies = [
[[package]]
name = "darling"
version = "0.13.3"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbcc37e3091b4dfd0af76cb0087b9c89b8e03072abc28ae2efc8fdd733bfc5f5"
checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
dependencies = [
"darling_core",
"darling_macro",
@ -656,9 +656,9 @@ dependencies = [
[[package]]
name = "darling_core"
version = "0.13.3"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9569a966dba8cd57879b8efd2bf82b5c56bb466e19767a69c560bddee1a27f5c"
checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
dependencies = [
"fnv",
"ident_case",
@ -670,9 +670,9 @@ dependencies = [
[[package]]
name = "darling_macro"
version = "0.13.3"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efae147148c6380157050146a2040b65dbe91bef6e97aaaa39ef0d469d2eb4af"
checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
dependencies = [
"darling_core",
"quote",
@ -1546,9 +1546,9 @@ dependencies = [
[[package]]
name = "js-sys"
version = "0.3.56"
version = "0.3.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04"
checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397"
dependencies = [
"wasm-bindgen",
]
@ -1584,9 +1584,9 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.121"
version = "0.2.122"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f"
checksum = "ec647867e2bf0772e28c8bcde4f0d19a9216916e890543b5a03ed8ef27b8f259"
[[package]]
name = "libloading"
@ -1629,9 +1629,9 @@ dependencies = [
[[package]]
name = "lofty"
version = "0.5.3"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfc751ba10f732cf5c522b9bc887027c9eee277512a38a3a0c4f1806bdcd730d"
checksum = "a944022a74ee371dbf1f36839f4a589822e8c980d1265f086eb540648c78083a"
dependencies = [
"base64 0.13.0",
"byteorder",
@ -3023,9 +3023,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
[[package]]
name = "wasm-bindgen"
version = "0.2.79"
version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06"
checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad"
dependencies = [
"cfg-if 1.0.0",
"wasm-bindgen-macro",
@ -3033,9 +3033,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.79"
version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca"
checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4"
dependencies = [
"bumpalo",
"lazy_static",
@ -3048,9 +3048,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.79"
version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01"
checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@ -3058,9 +3058,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.79"
version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc"
checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b"
dependencies = [
"proc-macro2",
"quote",
@ -3071,15 +3071,15 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.79"
version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2"
checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744"
[[package]]
name = "web-sys"
version = "0.3.56"
version = "0.3.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb"
checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283"
dependencies = [
"js-sys",
"wasm-bindgen",

View file

@ -25,7 +25,7 @@ hamming = "0.1.3"
# Needed by same music
bitflags = "1.3.2"
lofty="0.5.3"
lofty="0.6.0"
# Futures - needed by async progress sender
futures = "0.3.21"
@ -46,15 +46,15 @@ vid_dup_finder_lib = "0.1.0"
ffmpeg_cmdline_utils = "0.1.1"
# Saving/Loading Cache
serde = "1.0.133"
serde = "1.0.136"
bincode = "1.3.3"
serde_json = "1.0.74"
serde_json = "1.0.79"
# Language
i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.1"
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"
rust-embed = "6.3.0"
once_cell = "1.9.0"
once_cell = "1.10.0"
# Raw image files
rawloader = "0.37.0"

View file

@ -103,6 +103,7 @@ pub struct DuplicateFinder {
minimal_prehash_cache_file_size: u64,
delete_outdated_cache: bool,
use_reference_folders: bool,
case_sensitive_name_comparison: bool,
}
impl DuplicateFinder {
@ -134,6 +135,7 @@ impl DuplicateFinder {
minimal_prehash_cache_file_size: 0,
delete_outdated_cache: true,
use_reference_folders: false,
case_sensitive_name_comparison: false,
}
}
@ -176,6 +178,10 @@ impl DuplicateFinder {
self.delete_outdated_cache = delete_outdated_cache;
}
pub fn set_case_sensitive_name_comparison(&mut self, case_sensitive_name_comparison: bool) {
self.case_sensitive_name_comparison = case_sensitive_name_comparison;
}
pub const fn get_check_method(&self) -> &CheckingMethod {
&self.check_method
}
@ -293,9 +299,15 @@ impl DuplicateFinder {
}
fn check_files_name(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let group_by_func = if self.case_sensitive_name_comparison {
|fe: &FileEntry| fe.path.file_name().unwrap().to_string_lossy().to_string()
} else {
|fe: &FileEntry| fe.path.file_name().unwrap().to_string_lossy().to_lowercase()
};
let result = DirTraversalBuilder::new()
.root_dirs(self.directories.included_directories.clone())
.group_by(|fe| fe.path.file_name().unwrap().to_string_lossy().to_string())
.group_by(group_by_func)
.stop_receiver(stop_receiver)
.progress_sender(progress_sender)
.checking_method(CheckingMethod::Name)

View file

@ -10,7 +10,7 @@ use std::time::{Duration, SystemTime};
use std::{mem, thread};
use crossbeam_channel::Receiver;
use lofty::{read_from_path, ItemKey};
use lofty::{read_from_path, AudioFile, ItemKey};
use rayon::prelude::*;
use serde::{Deserialize, Serialize};

View file

@ -22,6 +22,12 @@ music_comparison_checkbox_tooltip =
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = Case Sensitive
duplicate_case_sensitive_name_tooltip =
When enabled, group only records when they have exactly same name e.g. Żołd <-> Żołd
Disabling such option will group names without checking if each letter is same size e.g. żoŁD <-> Żołd
duplicate_mode_name_combo_box = Name
duplicate_mode_size_combo_box = Size
duplicate_mode_hash_combo_box = Hash

View file

@ -173,11 +173,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
(ColumnsDuplicates::Path as u32, &directory),
(
ColumnsDuplicates::Modification as u32,
&(format!(
"{} - ({})",
NaiveDateTime::from_timestamp(base_file_entry.modified_date as i64, 0),
base_file_entry.size.file_size(options::BINARY).unwrap()
)),
&(NaiveDateTime::from_timestamp(base_file_entry.modified_date as i64, 0).to_string()),
),
(ColumnsDuplicates::ModificationAsSecs as u32, &(base_file_entry.modified_date)),
(ColumnsDuplicates::Color as u32, &(HEADER_ROW_COLOR.to_string())),
@ -197,11 +193,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
(ColumnsDuplicates::Path as u32, &directory),
(
ColumnsDuplicates::Modification as u32,
&(format!(
"{} - ({})",
NaiveDateTime::from_timestamp(entry.modified_date as i64, 0),
entry.size.file_size(options::BINARY).unwrap()
)),
&(NaiveDateTime::from_timestamp(entry.modified_date as i64, 0).to_string()),
),
(ColumnsDuplicates::ModificationAsSecs as u32, &(entry.modified_date)),
(ColumnsDuplicates::Color as u32, &(MAIN_ROW_COLOR.to_string())),

View file

@ -201,16 +201,10 @@ fn hardlink_symlink(
if hardlinking == TypeOfTool::Hardlinking {
for symhardlink_data in vec_symhardlink_data {
for file_to_hardlink in symhardlink_data.files_to_symhardlink {
// #[cfg(target_family = "unix")]
if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) {
add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str());
continue;
}
// #[cfg(target_family = "windows")]
// if let Err(e) = fs::hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) {
// add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str());
// continue;
// }
}
}
} else {

View file

@ -53,6 +53,7 @@ pub fn connect_button_search(
let buttons_names = gui_data.bottom_buttons.buttons_names;
let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone();
let check_button_duplicates_use_prehash_cache = gui_data.settings.check_button_duplicates_use_prehash_cache.clone();
let check_button_duplicate_case_sensitive_name: gtk::CheckButton = gui_data.main_notebook.check_button_duplicate_case_sensitive_name.clone();
let check_button_music_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_artist.clone();
let check_button_music_title: gtk::CheckButton = gui_data.main_notebook.check_button_music_title.clone();
let check_button_music_year: gtk::CheckButton = gui_data.main_notebook.check_button_music_year.clone();
@ -178,6 +179,8 @@ pub fn connect_button_search(
let use_prehash_cache = check_button_duplicates_use_prehash_cache.is_active();
let minimal_prehash_cache_file_size = entry_settings_prehash_cache_file_minimal_size.text().as_str().parse::<u64>().unwrap_or(0);
let case_sensitive_name_comparison = check_button_duplicate_case_sensitive_name.is_active();
let delete_outdated_cache = check_button_settings_duplicates_delete_outdated_cache.is_active();
let futures_sender_duplicate_files = futures_sender_duplicate_files.clone();
@ -200,6 +203,7 @@ pub fn connect_button_search(
df.set_use_cache(use_cache);
df.set_use_prehash_cache(use_prehash_cache);
df.set_delete_outdated_cache(delete_outdated_cache);
df.set_case_sensitive_name_comparison(case_sensitive_name_comparison);
df.find_duplicates(Some(&stop_receiver), Some(&futures_sender_duplicate_files));
let _ = glib_stop_sender.send(Message::Duplicates(df));
});

View file

@ -8,13 +8,23 @@ use crate::help_combo_box::DUPLICATES_CHECK_METHOD_COMBO_BOX;
pub fn connect_duplicate_combo_box(gui_data: &GuiData) {
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 label_duplicate_hash_type = gui_data.main_notebook.label_duplicate_hash_type.clone();
let check_button_duplicate_case_sensitive_name = gui_data.main_notebook.check_button_duplicate_case_sensitive_name.clone();
combo_box_duplicate_check_method.connect_changed(move |combo_box_duplicate_check_method| {
// None active can be if when adding elements(this signal is activated when e.g. adding new fields or removing them)
if let Some(chosen_index) = combo_box_duplicate_check_method.active() {
if DUPLICATES_CHECK_METHOD_COMBO_BOX[chosen_index as usize].check_method == CheckingMethod::Hash {
combo_box_duplicate_hash_type.set_sensitive(true);
combo_box_duplicate_hash_type.set_visible(true);
label_duplicate_hash_type.set_visible(true);
} else {
combo_box_duplicate_hash_type.set_sensitive(false);
combo_box_duplicate_hash_type.set_visible(false);
label_duplicate_hash_type.set_visible(false);
}
if DUPLICATES_CHECK_METHOD_COMBO_BOX[chosen_index as usize].check_method == CheckingMethod::Name {
check_button_duplicate_case_sensitive_name.set_visible(true);
} else {
check_button_duplicate_case_sensitive_name.set_visible(false);
}
}
});

View file

@ -65,6 +65,7 @@ pub struct GuiMainNotebook {
pub combo_box_duplicate_hash_type: gtk::ComboBoxText,
pub label_duplicate_check_method: gtk::Label,
pub label_duplicate_hash_type: gtk::Label,
pub check_button_duplicate_case_sensitive_name: gtk::CheckButton,
pub image_preview_duplicates: gtk::Image,
@ -198,6 +199,7 @@ impl GuiMainNotebook {
let entry_big_files_number: gtk::Entry = builder.object("entry_big_files_number").unwrap();
//// Check Buttons
let check_button_duplicate_case_sensitive_name: gtk::CheckButton = builder.object("check_button_duplicate_case_sensitive_name").unwrap();
let check_button_music_title: gtk::CheckButton = builder.object("check_button_music_title").unwrap();
let check_button_music_artist: gtk::CheckButton = builder.object("check_button_music_artist").unwrap();
let check_button_music_year: gtk::CheckButton = builder.object("check_button_music_year").unwrap();
@ -301,6 +303,7 @@ impl GuiMainNotebook {
combo_box_image_hash_size,
check_button_video_ignore_same_size,
check_button_image_fast_compare,
check_button_duplicate_case_sensitive_name,
}
}
@ -320,6 +323,7 @@ impl GuiMainNotebook {
}
pub fn update_language(&self) {
self.check_button_duplicate_case_sensitive_name.set_label(&flg!("duplicate_case_sensitive_name"));
self.check_button_music_title.set_label(&flg!("music_title_checkbox"));
self.check_button_music_artist.set_label(&flg!("music_artist_checkbox"));
self.check_button_music_year.set_label(&flg!("music_year_checkbox"));
@ -347,6 +351,8 @@ impl GuiMainNotebook {
self.combo_box_duplicate_check_method.set_tooltip_text(Some(&flg!("duplicate_check_method_tooltip")));
self.label_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip")));
self.combo_box_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip")));
self.check_button_duplicate_case_sensitive_name
.set_tooltip_text(Some(&flg!("duplicate_case_sensitive_name_tooltip")));
self.combo_box_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip")));
self.label_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip")));

View file

@ -4,6 +4,7 @@ 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 gtk::prelude::*;
use gtk::{ComboBoxText, ScrolledWindow, TextView};
@ -14,6 +15,7 @@ use czkawka_core::similar_images::SIMILAR_VALUES;
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;
use crate::help_functions::*;
use crate::language_functions::{get_language_from_combo_box_text, LANGUAGES_ALL};
use crate::localizer_core::generate_translation_hashmap;
@ -38,6 +40,7 @@ const DEFAULT_PREHASH_MINIMAL_CACHE_SIZE: &str = "0";
const DEFAULT_VIDEO_REMOVE_AUTO_OUTDATED_CACHE: bool = false;
const DEFAULT_IMAGE_REMOVE_AUTO_OUTDATED_CACHE: bool = true;
const DEFAULT_DUPLICATE_REMOVE_AUTO_OUTDATED_CACHE: bool = true;
const DEFAULT_DUPLICATE_CASE_SENSITIVE_NAME_CHECKING: bool = false;
const DEFAULT_NUMBER_OF_BIGGEST_FILES: &str = "50";
const DEFAULT_SIMILAR_IMAGES_SIMILARITY: i32 = 0;
@ -423,6 +426,7 @@ enum LoadText {
SimilarVideosSimilarity,
SimilarVideosIgnoreSameSize,
MusicApproximateComparison,
DuplicateNameCaseSensitive,
}
fn create_hash_map() -> (HashMap<LoadText, String>, HashMap<String, LoadText>) {
@ -463,6 +467,7 @@ fn create_hash_map() -> (HashMap<LoadText, String>, HashMap<String, LoadText>) {
(LoadText::SimilarVideosSimilarity, "similar_videos_similarity"),
(LoadText::SimilarVideosIgnoreSameSize, "similar_videos_ignore_same_size"),
(LoadText::MusicApproximateComparison, "music_approximate_comparison"),
(LoadText::DuplicateNameCaseSensitive, "duplicate_name_case_sensitive"),
];
let mut hashmap_ls: HashMap<LoadText, String> = Default::default();
let mut hashmap_sl: HashMap<String, LoadText> = Default::default();
@ -614,6 +619,10 @@ pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb
);
// Other2
saving_struct.save_var(
hashmap_ls.get(&LoadText::DuplicateNameCaseSensitive).unwrap().to_string(),
main_notebook.check_button_duplicate_case_sensitive_name.is_active(),
);
saving_struct.save_var(
hashmap_ls.get(&LoadText::NumberOfBiggestFiles).unwrap().to_string(),
main_notebook.entry_big_files_number.text(),
@ -735,6 +744,10 @@ pub fn load_configuration(
hashmap_ls.get(&LoadText::SimilarVideosIgnoreSameSize).unwrap().clone(),
DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE,
);
let check_button_case_sensitive_name = loaded_entries.get_integer(
hashmap_ls.get(&LoadText::DuplicateNameCaseSensitive).unwrap().clone(),
DEFAULT_DUPLICATE_CASE_SENSITIVE_NAME_CHECKING,
);
// Setting data
if manual_execution || loading_at_start {
@ -812,12 +825,31 @@ pub fn load_configuration(
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);
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);
main_notebook.check_button_image_ignore_same_size.set_active(similar_images_ignore_same_size);
main_notebook.check_button_image_fast_compare.set_active(similar_images_fast_compare);
main_notebook.check_button_video_ignore_same_size.set_active(similar_videos_ignore_same_size);
main_notebook.scale_similarity_similar_videos.set_value(similar_videos_similarity as f64);
{
let combo_chosen_index = main_notebook.combo_box_duplicate_check_method.active().unwrap();
if DUPLICATES_CHECK_METHOD_COMBO_BOX[combo_chosen_index as usize].check_method == CheckingMethod::Hash {
main_notebook.combo_box_duplicate_hash_type.set_visible(true);
main_notebook.label_duplicate_hash_type.set_visible(true);
} else {
main_notebook.combo_box_duplicate_hash_type.set_visible(false);
main_notebook.label_duplicate_hash_type.set_visible(false);
}
if DUPLICATES_CHECK_METHOD_COMBO_BOX[combo_chosen_index as usize].check_method == CheckingMethod::Name {
main_notebook.check_button_duplicate_case_sensitive_name.set_visible(true);
} else {
main_notebook.check_button_duplicate_case_sensitive_name.set_visible(false);
}
}
// Set size of similarity scale gtk node, must be set BEFORE setting value of this
let index = main_notebook.combo_box_image_hash_size.active().unwrap() as usize;

View file

@ -189,6 +189,7 @@
(5,167,"GtkButton","button_app_info",164,None,None,None,1),
(5,168,"GtkImage",None,167,None,None,None,None),
(5,169,"GtkCheckButton","check_button_music_length",105,None,None,None,4),
(5,170,"GtkCheckButton","check_button_duplicate_case_sensitive_name",56,None,None,None,4),
(6,1,"GtkAboutDialog","about_dialog",None,None,None,None,None),
(6,2,"GtkBox",None,1,"vbox",None,None,None),
(6,3,"GtkButtonBox",None,2,"action_area",None,None,None),
@ -930,6 +931,7 @@
(5,169,"GtkWidget","can-focus","True",None,None,None,None,None),
(5,169,"GtkWidget","receives-default","False",None,None,None,None,None),
(5,169,"GtkWidget","visible","True",None,None,None,None,None),
(5,170,"GtkButton","label","Case sensitive",None,None,None,None,None),
(6,1,"GtkAboutDialog","comments","2020 - 2022 Rafał Mikrut(qarmin)\n\nThis program is free to use and will always be.\n","yes",None,None,None,None),
(6,1,"GtkAboutDialog","license-type","mit-x11",None,None,None,None,None),
(6,1,"GtkAboutDialog","logo-icon-name","image-missing",None,None,None,None,None),
@ -1537,6 +1539,7 @@
(5,56,60,"GtkBoxLayoutChild","expand","False",None,None,None,None),
(5,56,60,"GtkBoxLayoutChild","fill","True",None,None,None,None),
(5,56,60,"GtkBoxLayoutChild","position","3",None,None,None,None),
(5,56,170,"GtkBoxLayoutChild","position","4",None,None,None,None),
(5,66,67,"GtkBoxLayoutChild","expand","False",None,None,None,None),
(5,66,67,"GtkBoxLayoutChild","fill","True",None,None,None,None),
(5,66,67,"GtkBoxLayoutChild","position","0",None,None,None,None),

View file

@ -687,6 +687,14 @@ Author: Rafał Mikrut
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="check_button_duplicate_case_sensitive_name">
<property name="label">Case sensitive</property>
</object>
<packing>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>