1
0
Fork 0
mirror of synced 2024-05-21 12:52:37 +12:00
This commit is contained in:
Rafał Mikrut 2024-01-20 13:47:44 +01:00
parent 3ea94f938b
commit e1ca412051
5 changed files with 89 additions and 85 deletions

View file

@ -192,7 +192,7 @@ upper_allowed_extensions_tooltip =
Usage example ".exe, IMAGE, VIDEO, .rar, 7z" - this means that images (e.g. jpg, png), videos (e.g. avi, mp4), exe, rar, and 7z files will be scanned. Usage example ".exe, IMAGE, VIDEO, .rar, 7z" - this means that images (e.g. jpg, png), videos (e.g. avi, mp4), exe, rar, and 7z files will be scanned.
upper_disabled_extensions_tooltip = upper_excluded_extensions_tooltip =
List of disabled files which will be ignored in scan. List of disabled files which will be ignored in scan.
When using both allowed and disabled extensions, this one has higher priority, so file will not be checked. When using both allowed and disabled extensions, this one has higher priority, so file will not be checked.
@ -203,7 +203,7 @@ upper_excluded_items_tooltip =
upper_excluded_items = Excluded Items: upper_excluded_items = Excluded Items:
upper_allowed_extensions = Allowed Extensions: upper_allowed_extensions = Allowed Extensions:
upper_disabled_extensions = Disabled Extensions: upper_excluded_extensions = Disabled Extensions:
# Popovers # Popovers

View file

@ -201,6 +201,7 @@ struct LoadedCommonItems {
recursive_search: bool, recursive_search: bool,
excluded_items: Vec<String>, excluded_items: Vec<String>,
allowed_extensions: String, allowed_extensions: String,
excluded_extensions: String,
hide_hard_links: bool, hide_hard_links: bool,
use_cache: bool, use_cache: bool,
save_also_as_json: bool, save_also_as_json: bool,
@ -217,6 +218,7 @@ impl LoadedCommonItems {
let check_button_settings_hide_hard_links = gui_data.settings.check_button_settings_hide_hard_links.clone(); let check_button_settings_hide_hard_links = gui_data.settings.check_button_settings_hide_hard_links.clone();
let check_button_settings_use_cache = gui_data.settings.check_button_settings_use_cache.clone(); let check_button_settings_use_cache = gui_data.settings.check_button_settings_use_cache.clone();
let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone(); let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone();
let entry_excluded_extensions = gui_data.upper_notebook.entry_excluded_extensions.clone();
let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone(); let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone();
let entry_general_maximal_size = gui_data.upper_notebook.entry_general_maximal_size.clone(); let entry_general_maximal_size = gui_data.upper_notebook.entry_general_maximal_size.clone();
let entry_general_minimal_size = gui_data.upper_notebook.entry_general_minimal_size.clone(); let entry_general_minimal_size = gui_data.upper_notebook.entry_general_minimal_size.clone();
@ -241,6 +243,7 @@ impl LoadedCommonItems {
.map(std::string::ToString::to_string) .map(std::string::ToString::to_string)
.collect::<Vec<String>>(); .collect::<Vec<String>>();
let allowed_extensions = entry_allowed_extensions.text().as_str().to_string(); let allowed_extensions = entry_allowed_extensions.text().as_str().to_string();
let excluded_extensions = entry_excluded_extensions.text().as_str().to_string();
let hide_hard_links = check_button_settings_hide_hard_links.is_active(); let hide_hard_links = check_button_settings_hide_hard_links.is_active();
let use_cache = check_button_settings_use_cache.is_active(); let use_cache = check_button_settings_use_cache.is_active();
let save_also_as_json = check_button_settings_save_also_json.is_active(); let save_also_as_json = check_button_settings_save_also_json.is_active();
@ -269,6 +272,7 @@ impl LoadedCommonItems {
recursive_search, recursive_search,
excluded_items, excluded_items,
allowed_extensions, allowed_extensions,
excluded_extensions,
hide_hard_links, hide_hard_links,
use_cache, use_cache,
save_also_as_json, save_also_as_json,
@ -319,19 +323,19 @@ fn duplicate_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut df = DuplicateFinder::new(); let mut item = DuplicateFinder::new();
df.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
df.set_minimal_cache_file_size(loaded_common_items.minimal_cache_file_size); item.set_minimal_cache_file_size(loaded_common_items.minimal_cache_file_size);
df.set_minimal_prehash_cache_file_size(minimal_prehash_cache_file_size); item.set_minimal_prehash_cache_file_size(minimal_prehash_cache_file_size);
df.set_check_method(check_method); item.set_check_method(check_method);
df.set_hash_type(hash_type); item.set_hash_type(hash_type);
df.set_ignore_hard_links(loaded_common_items.hide_hard_links); item.set_ignore_hard_links(loaded_common_items.hide_hard_links);
df.set_use_prehash_cache(use_prehash_cache); item.set_use_prehash_cache(use_prehash_cache);
df.set_delete_outdated_cache(delete_outdated_cache); item.set_delete_outdated_cache(delete_outdated_cache);
df.set_case_sensitive_name_comparison(case_sensitive_name_comparison); item.set_case_sensitive_name_comparison(case_sensitive_name_comparison);
df.find_duplicates(Some(&stop_receiver), Some(&progress_data_sender)); item.find_duplicates(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::Duplicates(df)).unwrap(); glib_stop_sender.send(Message::Duplicates(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -352,11 +356,11 @@ fn empty_files_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut vf = EmptyFiles::new(); let mut item = EmptyFiles::new();
vf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
vf.find_empty_files(Some(&stop_receiver), Some(&progress_data_sender)); item.find_empty_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::EmptyFiles(vf)).unwrap(); glib_stop_sender.send(Message::EmptyFiles(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -377,11 +381,11 @@ fn empty_directories_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut ef = EmptyFolder::new(); let mut item = EmptyFolder::new();
ef.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
ef.find_empty_folders(Some(&stop_receiver), Some(&progress_data_sender)); item.find_empty_folders(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::EmptyFolders(ef)).unwrap(); glib_stop_sender.send(Message::EmptyFolders(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -409,13 +413,13 @@ fn big_files_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut bf = BigFile::new(); let mut item = BigFile::new();
bf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
bf.set_number_of_files_to_check(numbers_of_files_to_check); item.set_number_of_files_to_check(numbers_of_files_to_check);
bf.set_search_mode(big_files_mode); item.set_search_mode(big_files_mode);
bf.find_big_files(Some(&stop_receiver), Some(&progress_data_sender)); item.find_big_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::BigFiles(bf)).unwrap(); glib_stop_sender.send(Message::BigFiles(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -436,11 +440,11 @@ fn temporary_files_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut tf = Temporary::new(); let mut item = Temporary::new();
tf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
tf.find_temporary_files(Some(&stop_receiver), Some(&progress_data_sender)); item.find_temporary_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::Temporary(tf)).unwrap(); glib_stop_sender.send(Message::Temporary(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -503,16 +507,16 @@ fn same_music_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut mf = SameMusic::new(); let mut item = SameMusic::new();
mf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
mf.set_music_similarity(music_similarity); item.set_music_similarity(music_similarity);
mf.set_maximum_difference(maximum_difference); item.set_maximum_difference(maximum_difference);
mf.set_minimum_segment_duration(minimum_segment_duration); item.set_minimum_segment_duration(minimum_segment_duration);
mf.set_check_type(check_method); item.set_check_type(check_method);
mf.set_approximate_comparison(approximate_comparison); item.set_approximate_comparison(approximate_comparison);
mf.find_same_music(Some(&stop_receiver), Some(&progress_data_sender)); item.find_same_music(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::SameMusic(mf)).unwrap(); glib_stop_sender.send(Message::SameMusic(item)).unwrap();
}) })
.unwrap(); .unwrap();
} else { } else {
@ -578,12 +582,12 @@ fn broken_files_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut br = BrokenFiles::new(); let mut item = BrokenFiles::new();
br.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
br.set_checked_types(checked_types); item.set_checked_types(checked_types);
br.find_broken_files(Some(&stop_receiver), Some(&progress_data_sender)); item.find_broken_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::BrokenFiles(br)).unwrap(); glib_stop_sender.send(Message::BrokenFiles(item)).unwrap();
}) })
.unwrap(); .unwrap();
} else { } else {
@ -651,17 +655,17 @@ fn similar_image_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut sf = SimilarImages::new(); let mut item = SimilarImages::new();
sf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
sf.set_similarity(similarity); item.set_similarity(similarity);
sf.set_hash_alg(hash_alg); item.set_hash_alg(hash_alg);
sf.set_hash_size(hash_size); item.set_hash_size(hash_size);
sf.set_image_filter(image_filter); item.set_image_filter(image_filter);
sf.set_delete_outdated_cache(delete_outdated_cache); item.set_delete_outdated_cache(delete_outdated_cache);
sf.set_exclude_images_with_same_size(ignore_same_size); item.set_exclude_images_with_same_size(ignore_same_size);
sf.find_similar_images(Some(&stop_receiver), Some(&progress_data_sender)); item.find_similar_images(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::SimilarImages(sf)).unwrap(); glib_stop_sender.send(Message::SimilarImages(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -691,14 +695,14 @@ fn similar_video_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut sf = SimilarVideos::new(); let mut item = SimilarVideos::new();
sf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
sf.set_tolerance(tolerance); item.set_tolerance(tolerance);
sf.set_delete_outdated_cache(delete_outdated_cache); item.set_delete_outdated_cache(delete_outdated_cache);
sf.set_exclude_videos_with_same_size(ignore_same_size); item.set_exclude_videos_with_same_size(ignore_same_size);
sf.find_similar_videos(Some(&stop_receiver), Some(&progress_data_sender)); item.find_similar_videos(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::SimilarVideos(sf)).unwrap(); glib_stop_sender.send(Message::SimilarVideos(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -719,11 +723,11 @@ fn bad_symlinks_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut isf = InvalidSymlinks::new(); let mut item = InvalidSymlinks::new();
isf.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
isf.find_invalid_links(Some(&stop_receiver), Some(&progress_data_sender)); item.find_invalid_links(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::InvalidSymlinks(isf)).unwrap(); glib_stop_sender.send(Message::InvalidSymlinks(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -744,11 +748,11 @@ fn bad_extensions_search(
thread::Builder::new() thread::Builder::new()
.stack_size(DEFAULT_THREAD_SIZE) .stack_size(DEFAULT_THREAD_SIZE)
.spawn(move || { .spawn(move || {
let mut be = BadExtensions::new(); let mut item = BadExtensions::new();
be.set_common_settings(&loaded_common_items); set_common_settings(&mut item, &loaded_common_items);
be.find_bad_extensions_files(Some(&stop_receiver), Some(&progress_data_sender)); item.find_bad_extensions_files(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::BadExtensions(be)).unwrap(); glib_stop_sender.send(Message::BadExtensions(item)).unwrap();
}) })
.unwrap(); .unwrap();
} }
@ -762,7 +766,7 @@ where
component.set_reference_directory(loaded_common_items.reference_directories.clone()); component.set_reference_directory(loaded_common_items.reference_directories.clone());
component.set_recursive_search(loaded_common_items.recursive_search); component.set_recursive_search(loaded_common_items.recursive_search);
component.set_allowed_extensions(loaded_common_items.allowed_extensions.clone()); component.set_allowed_extensions(loaded_common_items.allowed_extensions.clone());
component.set_excluded_directory(loaded_common_items.excluded_directories.clone()); component.set_excluded_extensions(loaded_common_items.excluded_extensions.clone());
component.set_excluded_items(loaded_common_items.excluded_items.clone()); component.set_excluded_items(loaded_common_items.excluded_items.clone());
component.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems); component.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
component.set_use_cache(loaded_common_items.use_cache); component.set_use_cache(loaded_common_items.use_cache);

View file

@ -23,7 +23,7 @@ pub struct GuiUpperNotebook {
pub entry_excluded_items: gtk4::Entry, pub entry_excluded_items: gtk4::Entry,
pub entry_allowed_extensions: gtk4::Entry, pub entry_allowed_extensions: gtk4::Entry,
pub entry_disabled_extensions: gtk4::Entry, pub entry_excluded_extensions: gtk4::Entry,
pub check_button_recursive: gtk4::CheckButton, pub check_button_recursive: gtk4::CheckButton,
@ -36,7 +36,7 @@ pub struct GuiUpperNotebook {
pub label_excluded_items: gtk4::Label, pub label_excluded_items: gtk4::Label,
pub label_allowed_extensions: gtk4::Label, pub label_allowed_extensions: gtk4::Label,
pub label_disabled_extensions: gtk4::Label, pub label_excluded_extensions: gtk4::Label,
pub entry_general_minimal_size: gtk4::Entry, pub entry_general_minimal_size: gtk4::Entry,
pub entry_general_maximal_size: gtk4::Entry, pub entry_general_maximal_size: gtk4::Entry,
@ -66,7 +66,7 @@ impl GuiUpperNotebook {
tree_view_excluded_directories.add_controller(gc_tree_view_excluded_directories.clone()); tree_view_excluded_directories.add_controller(gc_tree_view_excluded_directories.clone());
let entry_allowed_extensions: gtk4::Entry = builder.object("entry_allowed_extensions").unwrap(); let entry_allowed_extensions: gtk4::Entry = builder.object("entry_allowed_extensions").unwrap();
let entry_disabled_extensions: gtk4::Entry = builder.object("entry_disabled_extensions").unwrap(); let entry_excluded_extensions: gtk4::Entry = builder.object("entry_excluded_extensions").unwrap();
let entry_excluded_items: gtk4::Entry = builder.object("entry_excluded_items").unwrap(); let entry_excluded_items: gtk4::Entry = builder.object("entry_excluded_items").unwrap();
let check_button_recursive: gtk4::CheckButton = builder.object("check_button_recursive").unwrap(); let check_button_recursive: gtk4::CheckButton = builder.object("check_button_recursive").unwrap();
@ -80,7 +80,7 @@ impl GuiUpperNotebook {
let label_excluded_items: gtk4::Label = builder.object("label_excluded_items").unwrap(); let label_excluded_items: gtk4::Label = builder.object("label_excluded_items").unwrap();
let label_allowed_extensions: gtk4::Label = builder.object("label_allowed_extensions").unwrap(); let label_allowed_extensions: gtk4::Label = builder.object("label_allowed_extensions").unwrap();
let label_disabled_extensions: gtk4::Label = builder.object("label_disabled_extensions").unwrap(); let label_excluded_extensions: gtk4::Label = builder.object("label_excluded_extensions").unwrap();
let entry_general_minimal_size: gtk4::Entry = builder.object("entry_general_minimal_size").unwrap(); let entry_general_minimal_size: gtk4::Entry = builder.object("entry_general_minimal_size").unwrap();
let entry_general_maximal_size: gtk4::Entry = builder.object("entry_general_maximal_size").unwrap(); let entry_general_maximal_size: gtk4::Entry = builder.object("entry_general_maximal_size").unwrap();
@ -107,7 +107,7 @@ impl GuiUpperNotebook {
gc_tree_view_excluded_directories, gc_tree_view_excluded_directories,
entry_excluded_items, entry_excluded_items,
entry_allowed_extensions, entry_allowed_extensions,
entry_disabled_extensions, entry_excluded_extensions,
check_button_recursive, check_button_recursive,
buttons_manual_add_included_directory, buttons_manual_add_included_directory,
buttons_add_included_directory, buttons_add_included_directory,
@ -117,7 +117,7 @@ impl GuiUpperNotebook {
buttons_remove_excluded_directory, buttons_remove_excluded_directory,
label_excluded_items, label_excluded_items,
label_allowed_extensions, label_allowed_extensions,
label_disabled_extensions, label_excluded_extensions,
entry_general_minimal_size, entry_general_minimal_size,
entry_general_maximal_size, entry_general_maximal_size,
label_general_size_bytes, label_general_size_bytes,
@ -147,14 +147,14 @@ impl GuiUpperNotebook {
self.label_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip"))); self.label_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip")));
self.entry_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip"))); self.entry_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip")));
self.label_disabled_extensions.set_tooltip_text(Some(&flg!("upper_disabled_extensions_tooltip"))); self.label_excluded_extensions.set_tooltip_text(Some(&flg!("upper_excluded_extensions_tooltip")));
self.entry_disabled_extensions.set_tooltip_text(Some(&flg!("upper_disabled_extensions_tooltip"))); self.entry_excluded_extensions.set_tooltip_text(Some(&flg!("upper_excluded_extensions_tooltip")));
self.label_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip"))); self.label_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip")));
self.entry_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip"))); self.entry_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip")));
self.label_excluded_items.set_label(&flg!("upper_excluded_items")); self.label_excluded_items.set_label(&flg!("upper_excluded_items"));
self.label_allowed_extensions.set_label(&flg!("upper_allowed_extensions")); self.label_allowed_extensions.set_label(&flg!("upper_allowed_extensions"));
self.label_disabled_extensions.set_label(&flg!("upper_disabled_extensions")); self.label_excluded_extensions.set_label(&flg!("upper_excluded_extensions"));
self.label_general_size_bytes.set_label(&flg!("main_label_size_bytes")); self.label_general_size_bytes.set_label(&flg!("main_label_size_bytes"));
self.label_general_min_size.set_label(&flg!("main_label_min_size")); self.label_general_min_size.set_label(&flg!("main_label_min_size"));

View file

@ -242,8 +242,8 @@
(5,237,"GtkScale","scale_similarity_same_music",117,None,None,None,9,None), (5,237,"GtkScale","scale_similarity_same_music",117,None,None,None,9,None),
(5,238,"GtkLabel","label_same_music_seconds",117,None,None,None,6,None), (5,238,"GtkLabel","label_same_music_seconds",117,None,None,None,6,None),
(5,239,"GtkLabel","label_same_music_similarity",117,None,None,None,8,None), (5,239,"GtkLabel","label_same_music_similarity",117,None,None,None,8,None),
(5,240,"GtkLabel","label_disabled_extensions",46,None,None,None,2,None), (5,240,"GtkLabel","label_excluded_extensions",46,None,None,None,2,None),
(5,241,"GtkEntry","entry_disabled_extensions",46,None,None,None,3,None), (5,241,"GtkEntry","entry_excluded_extensions",46,None,None,None,3,None),
(6,1,"GtkPopover","popover_right_click",None,None,None,None,None,None), (6,1,"GtkPopover","popover_right_click",None,None,None,None,None,None),
(6,2,"GtkBox",None,1,None,None,None,None,None), (6,2,"GtkBox",None,1,None,None,None,None,None),
(6,3,"GtkButton","buttons_popover_right_click_open_file",2,None,None,None,None,None), (6,3,"GtkButton","buttons_popover_right_click_open_file",2,None,None,None,None,None),

View file

@ -270,12 +270,12 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label_disabled_extensions"> <object class="GtkLabel" id="label_excluded_extensions">
<property name="label" translatable="yes">Disabled Extensions</property> <property name="label" translatable="yes">Disabled Extensions</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkEntry" id="entry_disabled_extensions"> <object class="GtkEntry" id="entry_excluded_extensions">
<property name="focusable">1</property> <property name="focusable">1</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
</object> </object>