1
0
Fork 0
mirror of synced 2024-05-05 04:52:38 +12:00

Add image preview to duplicate finder (#408)

This commit is contained in:
Rafał Mikrut 2021-08-07 10:38:10 +02:00 committed by GitHub
parent a92a113714
commit fcc909ffd7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 338 additions and 226 deletions

View file

@ -57,6 +57,7 @@ pub struct GuiMainNotebook {
pub radio_button_hash_type_xxh3: gtk::RadioButton,
pub image_preview_similar_images: gtk::Image,
pub image_preview_duplicates: gtk::Image,
}
impl GuiMainNotebook {
@ -114,6 +115,7 @@ impl GuiMainNotebook {
let radio_button_hash_type_xxh3: gtk::RadioButton = builder.object("radio_button_hash_type_xxh3").unwrap();
let image_preview_similar_images: gtk::Image = builder.object("image_preview_similar_images").unwrap();
let image_preview_duplicates: gtk::Image = builder.object("image_preview_duplicates").unwrap();
Self {
notebook_main,
@ -158,6 +160,7 @@ impl GuiMainNotebook {
image_preview_similar_images,
entry_duplicate_maximal_size,
entry_same_music_maximal_size,
image_preview_duplicates,
}
}
}

View file

@ -17,6 +17,7 @@ pub struct GuiSettings {
// Duplicates
pub check_button_settings_hide_hard_links: gtk::CheckButton,
pub entry_settings_cache_file_minimal_size: gtk::Entry,
pub check_button_settings_show_preview_duplicates: gtk::CheckButton,
// Similar Images
pub check_button_settings_show_preview_similar_images: gtk::CheckButton,
@ -47,6 +48,7 @@ impl GuiSettings {
// Duplicates
let check_button_settings_hide_hard_links: gtk::CheckButton = builder.object("check_button_settings_hide_hard_links").unwrap();
let entry_settings_cache_file_minimal_size: gtk::Entry = builder.object("entry_settings_cache_file_minimal_size").unwrap();
let check_button_settings_show_preview_duplicates: gtk::CheckButton = builder.object("check_button_settings_show_preview_duplicates").unwrap();
// Similar Images
let check_button_settings_show_preview_similar_images: gtk::CheckButton = builder.object("check_button_settings_show_preview_similar_images").unwrap();
@ -67,6 +69,7 @@ impl GuiSettings {
check_button_settings_use_trash,
check_button_settings_hide_hard_links,
entry_settings_cache_file_minimal_size,
check_button_settings_show_preview_duplicates,
check_button_settings_show_preview_similar_images,
button_settings_save_configuration,
button_settings_load_configuration,

View file

@ -45,7 +45,9 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
let scrolled_window_broken_files = gui_data.main_notebook.scrolled_window_broken_files.clone();
let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone();
let image_preview_duplicates = gui_data.main_notebook.image_preview_duplicates.clone();
let check_button_settings_show_preview_similar_images = gui_data.settings.check_button_settings_show_preview_similar_images.clone();
let check_button_settings_show_preview_duplicates = gui_data.settings.check_button_settings_show_preview_duplicates.clone();
let text_view_errors = gui_data.text_view_errors.clone();
let scale_similarity = gui_data.main_notebook.scale_similarity.clone();
@ -60,6 +62,11 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
{
// Duplicate Files
{
let image_preview_duplicates_cloned = image_preview_duplicates.clone();
image_preview_duplicates.hide();
let text_view_errors_cloned = text_view_errors.clone();
let check_button_settings_show_preview_duplicates_cloned = check_button_settings_show_preview_duplicates.clone();
let col_types: [glib::types::Type; 8] = [
glib::types::Type::BOOL,
glib::types::Type::BOOL,
@ -81,9 +88,15 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
tree_view.connect_button_press_event(opening_double_click_function_duplicates);
tree_view.connect_key_press_event(opening_enter_function_duplicates);
tree_view.connect_button_release_event(move |_tree_view, _e| {
// println!("{}", e.button());
tree_view.connect_button_release_event(move |tree_view, _event| {
show_preview(
tree_view,
&text_view_errors_cloned,
&check_button_settings_show_preview_duplicates_cloned,
&image_preview_duplicates_cloned,
ColumnsDuplicates::Path as i32,
ColumnsDuplicates::Name as i32,
);
gtk::Inhibit(false)
});
@ -91,6 +104,8 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
scrolled_window_duplicate_finder.add(&tree_view);
scrolled_window_duplicate_finder.show_all();
let text_view_errors_cloned = text_view_errors.clone();
let gui_data = gui_data.clone();
tree_view.connect_key_release_event(move |tree_view, e| {
if let Some(button_number) = e.keycode() {
@ -121,8 +136,17 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
ColumnsDuplicates::ActiveSelectButton as i32,
&gui_data,
);
image_preview_duplicates.hide();
}
}
show_preview(
tree_view,
&text_view_errors_cloned,
&check_button_settings_show_preview_duplicates,
&image_preview_duplicates,
ColumnsDuplicates::Path as i32,
ColumnsDuplicates::Name as i32,
);
gtk::Inhibit(false)
});
}
@ -273,7 +297,14 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
tree_view.connect_button_press_event(opening_double_click_function_similar_images);
tree_view.connect_key_press_event(opening_enter_function_similar_images);
tree_view.connect_button_release_event(move |tree_view, _event| {
show_preview(tree_view, &text_view_errors, &check_button_settings_show_preview_similar_images, &image_preview_similar_images);
show_preview(
tree_view,
&text_view_errors,
&check_button_settings_show_preview_similar_images,
&image_preview_similar_images,
ColumnsSimilarImages::Path as i32,
ColumnsSimilarImages::Name as i32,
);
gtk::Inhibit(false)
});
@ -317,7 +348,14 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
image_preview_similar_images_clone.hide();
}
}
show_preview(tree_view, &text_view_errors, &check_button_settings_show_preview_similar_images, &image_preview_similar_images);
show_preview(
tree_view,
&text_view_errors,
&check_button_settings_show_preview_similar_images,
&image_preview_similar_images,
ColumnsSimilarImages::Path as i32,
ColumnsSimilarImages::Name as i32,
);
gtk::Inhibit(false)
});
}
@ -579,13 +617,13 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
});
}
}
fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_settings_show_preview_similar_images: &CheckButton, image_preview_similar_images: &Image) {
fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_settings_show_preview: &CheckButton, image_preview_similar_images: &Image, column_path: i32, column_name: i32) {
let (selected_rows, tree_model) = tree_view.selection().selected_rows();
let mut created_image = false;
// Only show preview when selected is only one item, because there is no method to recognize current clicked item in multiselection
if selected_rows.len() == 1 && check_button_settings_show_preview_similar_images.is_active() {
if selected_rows.len() == 1 && check_button_settings_show_preview.is_active() {
let tree_path = selected_rows[0].clone();
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
// TODO labels on {} are in testing stage, so we just ignore for now this warning until found better idea how to fix this
@ -601,13 +639,17 @@ fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_
add_text_to_text_view(text_view_errors, format!("Failed to create dir {} needed by image preview", cache_dir.display()).as_str());
break 'dir;
}
let path = tree_model.value(&tree_model.iter(&tree_path).unwrap(), ColumnsSimilarImages::Path as i32).get::<String>().unwrap();
let name = tree_model.value(&tree_model.iter(&tree_path).unwrap(), ColumnsSimilarImages::Name as i32).get::<String>().unwrap();
let path = tree_model.value(&tree_model.iter(&tree_path).unwrap(), column_path).get::<String>().unwrap();
let name = tree_model.value(&tree_model.iter(&tree_path).unwrap(), column_name).get::<String>().unwrap();
let file_name = format!("{}/{}", path, name);
let file_name = file_name.as_str();
if let Some(extension) = Path::new(file_name).extension() {
if !["jpg", "jpeg", "png", "bmp", "tiff", "tif", "pnm", "tga", "ff", "gif", "jif", "jfi", "webp"].contains(&extension.to_string_lossy().to_string().to_lowercase().as_str()) {
break 'dir;
}
let img = match image::open(&file_name) {
Ok(t) => t,
Err(_) => {

View file

@ -106,10 +106,15 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) {
data_to_save.push(check_button_settings_confirm_group_deletion.is_active().to_string());
//// Show image previews in similar images
data_to_save.push("--show_previews:".to_string());
data_to_save.push("--show_previews_similar_images:".to_string());
let check_button_settings_show_preview_similar_images = gui_data.settings.check_button_settings_show_preview_similar_images.clone();
data_to_save.push(check_button_settings_show_preview_similar_images.is_active().to_string());
//// Show image previews in duplicates
data_to_save.push("--show_previews_duplicates:".to_string());
let check_button_settings_show_preview_duplicates = gui_data.settings.check_button_settings_show_preview_duplicates.clone();
data_to_save.push(check_button_settings_show_preview_duplicates.is_active().to_string());
//// Show bottom text panel with errors
data_to_save.push("--bottom_text_panel:".to_string());
let check_button_settings_show_text_view = gui_data.settings.check_button_settings_show_text_view.clone();
@ -180,7 +185,8 @@ enum TypeOfLoadedData {
SavingAtExit,
ConfirmDeletion,
ConfirmGroupDeletion,
ShowPreviews,
ShowPreviewSimilarImages,
ShowPreviewDuplicates,
BottomTextPanel,
HideHardLinks,
UseCache,
@ -217,7 +223,7 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) {
}
};
// Parsing Data
// Parsing Data - this are default values
let mut included_directories: Vec<String> = Vec::new();
let mut excluded_directories: Vec<String> = Vec::new();
@ -227,7 +233,8 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) {
let mut saving_at_exit: bool = true;
let mut confirm_deletion: bool = true;
let mut confirm_group_deletion: bool = true;
let mut show_previews: bool = true;
let mut show_previews_similar_images: bool = true;
let mut show_previews_duplicates: bool = true;
let mut bottom_text_panel: bool = true;
let mut hide_hard_links: bool = true;
let mut use_cache: bool = true;
@ -256,8 +263,10 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) {
current_type = TypeOfLoadedData::ConfirmDeletion;
} else if line.starts_with("--confirm_group_deletion") {
current_type = TypeOfLoadedData::ConfirmGroupDeletion;
} else if line.starts_with("--show_previews") {
current_type = TypeOfLoadedData::ShowPreviews;
} else if line.starts_with("--show_previews_similar_images") {
current_type = TypeOfLoadedData::ShowPreviewSimilarImages;
} else if line.starts_with("--show_previews_duplicates") {
current_type = TypeOfLoadedData::ShowPreviewDuplicates;
} else if line.starts_with("--bottom_text_panel") {
current_type = TypeOfLoadedData::BottomTextPanel;
} else if line.starts_with("--hide_hard_links") {
@ -346,12 +355,25 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) {
);
}
}
TypeOfLoadedData::ShowPreviews => {
TypeOfLoadedData::ShowPreviewSimilarImages => {
let line = line.to_lowercase();
if line == "1" || line == "true" {
show_previews = true;
show_previews_similar_images = true;
} else if line == "0" || line == "false" {
show_previews = false;
show_previews_similar_images = false;
} else {
add_text_to_text_view(
&text_view_errors,
format!("Found invalid data in line {} \"{}\" isn't proper value(0/1/true/false) when loading file {:?}", line_number, line, config_file).as_str(),
);
}
}
TypeOfLoadedData::ShowPreviewDuplicates => {
let line = line.to_lowercase();
if line == "1" || line == "true" {
show_previews_duplicates = true;
} else if line == "0" || line == "false" {
show_previews_duplicates = false;
} else {
add_text_to_text_view(
&text_view_errors,
@ -460,7 +482,8 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) {
gui_data.settings.check_button_settings_save_at_exit.set_active(saving_at_exit);
gui_data.settings.check_button_settings_confirm_deletion.set_active(confirm_deletion);
gui_data.settings.check_button_settings_confirm_group_deletion.set_active(confirm_group_deletion);
gui_data.settings.check_button_settings_show_preview_similar_images.set_active(show_previews);
gui_data.settings.check_button_settings_show_preview_similar_images.set_active(show_previews_similar_images);
gui_data.settings.check_button_settings_show_preview_duplicates.set_active(show_previews_duplicates);
gui_data.settings.check_button_settings_show_text_view.set_active(bottom_text_panel);
if !bottom_text_panel {
@ -549,6 +572,7 @@ pub fn reset_configuration(gui_data: &GuiData, manual_clearing: bool) {
gui_data.settings.check_button_settings_confirm_deletion.set_active(true);
gui_data.settings.check_button_settings_confirm_group_deletion.set_active(true);
gui_data.settings.check_button_settings_show_preview_similar_images.set_active(true);
gui_data.settings.check_button_settings_show_preview_duplicates.set_active(true);
gui_data.settings.check_button_settings_show_text_view.set_active(true);
gui_data.settings.check_button_settings_hide_hard_links.set_active(true);
gui_data.settings.check_button_settings_use_cache.set_active(true);

View file

@ -648,17 +648,87 @@ Author: Rafał Mikrut
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">8</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Size(bytes)</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Check method:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_hash">
<property name="label" translatable="yes">Hash</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_hashmb">
<property name="label" translatable="yes">HashMb</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_duplicates_hash</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_size">
<property name="label" translatable="yes">Size</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_duplicates_hash</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_name">
<property name="label" translatable="yes">Name</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_duplicates_hash</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -667,10 +737,66 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkLabel">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Min:</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Hash type:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_hash_type_blake3">
<property name="label" translatable="yes">Blake3</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_hash_type_crc32">
<property name="label" translatable="yes">CRC32</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_hash_type_blake3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_hash_type_xxh3">
<property name="label" translatable="yes">XXH3</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_hash_type_blake3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -679,220 +805,118 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_duplicate_minimal_size">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">8</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Size(bytes)</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Min:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_duplicate_minimal_size">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="max-length">15</property>
<property name="text" translatable="yes">8192</property>
<property name="caps-lock-warning">False</property>
<property name="input-purpose">number</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Max:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_duplicate_maximal_size">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="max-length">15</property>
<property name="text" translatable="yes">1099512000000</property>
<property name="caps-lock-warning">False</property>
<property name="input-purpose">number</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolled_window_duplicate_finder">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="max-length">15</property>
<property name="text" translatable="yes">8192</property>
<property name="caps-lock-warning">False</property>
<property name="input-purpose">number</property>
<property name="shadow-type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Max:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_duplicate_maximal_size">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="max-length">15</property>
<property name="text" translatable="yes">1099512000000</property>
<property name="caps-lock-warning">False</property>
<property name="input-purpose">number</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Check method:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_hash">
<property name="label" translatable="yes">Hash</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_hashmb">
<property name="label" translatable="yes">HashMb</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_duplicates_hash</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_size">
<property name="label" translatable="yes">Size</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_duplicates_hash</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_duplicates_name">
<property name="label" translatable="yes">Name</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_duplicates_hash</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Hash type:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_hash_type_blake3">
<property name="label" translatable="yes">Blake3</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_hash_type_crc32">
<property name="label" translatable="yes">CRC32</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_hash_type_blake3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_hash_type_xxh3">
<property name="label" translatable="yes">XXH3</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
<property name="group">radio_button_hash_type_blake3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolled_window_duplicate_finder">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage" id="image_preview_duplicates">
<property name="width-request">100</property>
<property name="height-request">80</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">center</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
@ -1232,6 +1256,7 @@ Author: Rafał Mikrut
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">center</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>

View file

@ -222,6 +222,21 @@ Author: Rafał Mikrut
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="check_button_settings_show_preview_duplicates">
<property name="label" translatable="yes">Show image preview</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>