1
0
Fork 0
mirror of synced 2024-04-29 01:52:39 +12:00

Use GtkScale instead radio buttons for similarity (#397)

* Use GtkScale instead radio buttons for similarity

* Fixes
This commit is contained in:
Rafał Mikrut 2021-07-24 22:00:39 +02:00 committed by GitHub
parent a623f2be00
commit 0e9b8a1651
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 114 additions and 219 deletions

74
Cargo.lock generated
View file

@ -156,13 +156,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "bk-tree"
version = "0.4.0"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6121f6e107e94d717b5ca2631d56e7c2ed1542a21b2eb87b4bda1d6c1420ef3f"
dependencies = [
"fnv",
"triple_accel",
]
checksum = "5488039ea2c6de8668351415e39a0218a8955bffadcff0cf01d1293a20854584"
[[package]]
name = "blake3"
@ -187,9 +183,9 @@ checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631"
[[package]]
name = "bytemuck"
version = "1.7.0"
version = "1.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9966d2ab714d0f785dbac0a0396251a35280aeb42413281617d0209ab4898435"
checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b"
[[package]]
name = "byteorder"
@ -274,9 +270,9 @@ dependencies = [
[[package]]
name = "cfg-expr"
version = "0.7.4"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30aa9e2ffbb838c6b451db14f3cd8e63ed622bf859f9956bc93845a10fafc26a"
checksum = "70a1d12766bbdd5d44caab5df04a9bffec9cd855a1b44b15de5665d70c085f94"
dependencies = [
"smallvec",
]
@ -645,9 +641,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "futures"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27"
checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b"
dependencies = [
"futures-channel",
"futures-core",
@ -660,9 +656,9 @@ dependencies = [
[[package]]
name = "futures-channel"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2"
checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9"
dependencies = [
"futures-core",
"futures-sink",
@ -670,15 +666,15 @@ dependencies = [
[[package]]
name = "futures-core"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1"
checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99"
[[package]]
name = "futures-executor"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79"
checksum = "4d0d535a57b87e1ae31437b892713aee90cd2d7b0ee48727cd11fc72ef54761c"
dependencies = [
"futures-core",
"futures-task",
@ -687,15 +683,15 @@ dependencies = [
[[package]]
name = "futures-io"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1"
checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582"
[[package]]
name = "futures-macro"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121"
checksum = "c54913bae956fb8df7f4dc6fc90362aa72e69148e3f39041fbe8742d21e0ac57"
dependencies = [
"autocfg",
"proc-macro-hack",
@ -706,21 +702,21 @@ dependencies = [
[[package]]
name = "futures-sink"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282"
checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53"
[[package]]
name = "futures-task"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae"
checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2"
[[package]]
name = "futures-util"
version = "0.3.15"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967"
checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78"
dependencies = [
"autocfg",
"futures-channel",
@ -1649,9 +1645,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
[[package]]
name = "proc-macro2"
version = "1.0.27"
version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038"
checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612"
dependencies = [
"unicode-xid",
]
@ -1985,9 +1981,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
[[package]]
name = "syn"
version = "1.0.73"
version = "1.0.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7"
checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c"
dependencies = [
"proc-macro2",
"quote",
@ -1996,9 +1992,9 @@ dependencies = [
[[package]]
name = "system-deps"
version = "3.1.2"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ab7dbd121ce66af2176147a48c7e01aaf1f001837a18a7cf4317858606bbdf8"
checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6"
dependencies = [
"anyhow",
"cfg-expr",
@ -2079,9 +2075,9 @@ dependencies = [
[[package]]
name = "tinyvec"
version = "1.3.0"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ac2e1d4bd0f75279cfd5a076e0d578bbf02c22b7c39e766c437dd49b3ec43e0"
checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338"
dependencies = [
"tinyvec_macros",
]
@ -2126,12 +2122,6 @@ dependencies = [
"winapi",
]
[[package]]
name = "triple_accel"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622b09ce2fe2df4618636fb92176d205662f59803f39e70d1c333393082de96c"
[[package]]
name = "typenum"
version = "1.13.0"

View file

@ -286,14 +286,15 @@ fn parse_delete_method(src: &str) -> Result<DeleteMethod, &'static str> {
}
}
// TODO For now it looks different
fn parse_similar_images_similarity(src: &str) -> Result<Similarity, &'static str> {
match src.to_ascii_lowercase().replace('_', "").as_str() {
"minimal" => Ok(Similarity::Minimal),
"verysmall" => Ok(Similarity::VerySmall),
"small" => Ok(Similarity::Small),
"medium" => Ok(Similarity::Medium),
"high" => Ok(Similarity::High),
"veryhigh" => Ok(Similarity::VeryHigh),
"minimal" => Ok(Similarity::Similar(5)),
"verysmall" => Ok(Similarity::Similar(4)),
"small" => Ok(Similarity::Similar(3)),
"medium" => Ok(Similarity::Similar(2)),
"high" => Ok(Similarity::Similar(1)),
"veryhigh" => Ok(Similarity::Similar(0)),
_ => Err("Couldn't parse the delete method (allowed: verysmall, small, medium, high, veryhigh)"),
}
}

View file

@ -19,7 +19,7 @@ directories-next = "2.0.0"
# Needed by similar images
img_hash = "3.2.0"
bk-tree = "0.4.0"
bk-tree = "0.3.0" # Do not update. Updating broke of searching for similar hashes
image = "0.23.14"
hamming = "0.1.3"

View file

@ -38,12 +38,7 @@ pub struct ProgressData {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
pub enum Similarity {
None,
Minimal,
VerySmall,
Small,
Medium,
High,
VeryHigh,
Similar(u64),
}
#[derive(Clone, Debug)]
@ -60,14 +55,14 @@ pub struct FileEntry {
struct Hamming;
impl bk_tree::Metric<Node> for Hamming {
fn distance(&self, a: &Node, b: &Node) -> u32 {
hamming::distance_fast(a, b).unwrap() as u32
fn distance(&self, a: &Node, b: &Node) -> u64 {
hamming::distance_fast(a, b).unwrap() as u64
}
// TODO Probably needs to be implemented
fn threshold_distance(&self, _a: &Node, _b: &Node, _threshold: u32) -> Option<u32> {
None
}
// // TODO Probably needs to be implemented
// fn threshold_distance(&self, _a: &Node, _b: &Node, _threshold: u32) -> Option<u32> {
// None
// }
}
/// Struct to store most basics info about all folder
@ -115,7 +110,7 @@ impl SimilarImages {
minimal_file_size: 1024 * 16, // 16 KB should be enough to exclude too small images from search
image_hashes: Default::default(),
stopped_search: false,
similarity: Similarity::High,
similarity: Similarity::Similar(1),
images_to_check: Default::default(),
use_cache: true,
}
@ -416,6 +411,10 @@ impl SimilarImages {
let hash = hasher.hash_image(&image);
let mut buf = [0u8; 8];
buf.copy_from_slice(&hash.as_bytes());
if buf.iter().all(|e| *e == 0) {
// A little broken image
return Some(None);
}
file_entry.hash = buf;
Some(Some((file_entry, buf)))
@ -455,14 +454,9 @@ impl SimilarImages {
Common::print_time(hash_map_modification, SystemTime::now(), "sort_images - saving data to files".to_string());
let hash_map_modification = SystemTime::now();
let similarity: u32 = match self.similarity {
Similarity::VeryHigh => 0,
Similarity::High => 1,
Similarity::Medium => 2,
Similarity::Small => 3,
Similarity::VerySmall => 4,
Similarity::Minimal => 5,
_ => panic!("0-5 similarity levels are allowed, check if not added more."),
let similarity: u64 = match self.similarity {
Similarity::Similar(k) => k,
_ => panic!(),
};
// TODO
@ -500,7 +494,7 @@ impl SimilarImages {
dimensions: fe.dimensions.clone(),
modified_date: fe.modified_date,
hash: fe.hash,
similarity: Similarity::VeryHigh,
similarity: Similarity::Similar(0),
})
.collect();
@ -522,15 +516,7 @@ impl SimilarImages {
dimensions: fe.dimensions.clone(),
modified_date: fe.modified_date,
hash: [0; 8],
similarity: match similarity {
0 => Similarity::VeryHigh,
1 => Similarity::High,
2 => Similarity::Medium,
3 => Similarity::Small,
4 => Similarity::VerySmall,
5 => Similarity::Minimal,
_ => panic!("0-5 similarity levels are allowed, check if not added more."),
},
similarity: Similarity::Similar(*similarity),
})
.collect::<Vec<_>>()),
);
@ -664,18 +650,6 @@ impl PrintResults for SimilarImages {
}
}
fn get_string_from_similarity(similarity: &Similarity) -> &str {
match similarity {
Similarity::Minimal => "Minimal",
Similarity::VerySmall => "Very Small",
Similarity::Small => "Small",
Similarity::Medium => "Medium",
Similarity::High => "High",
Similarity::VeryHigh => "Very High",
Similarity::None => panic!(),
}
}
fn save_hashes_to_file(hashmap: &BTreeMap<String, FileEntry>, text_messages: &mut Messages) {
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
// Lin: /home/username/.cache/czkawka
@ -810,3 +784,27 @@ fn load_hashes_from_file(text_messages: &mut Messages) -> Option<BTreeMap<String
text_messages.messages.push("Cannot find or open system config dir to save cache file".to_string());
None
}
pub fn get_string_from_similarity(similarity: &Similarity) -> String {
match similarity {
Similarity::None => {
panic!()
}
Similarity::Similar(k) => {
if *k < 1 {
format!("Very High {}", *k)
} else if *k < 2 {
format!("High {}", *k)
} else if *k < 4 {
format!("Medium {}", *k)
} else if *k < 6 {
format!("Small {}", *k)
} else if *k < 9 {
format!("Very Small {}", *k)
} else if *k < 13 {
format!("Minimal {}", *k)
} else {
panic!()
}
}
}
}

View file

@ -53,12 +53,7 @@ pub fn connect_button_search(
let radio_button_duplicates_size = gui_data.main_notebook.radio_button_duplicates_size.clone();
let radio_button_duplicates_hashmb = gui_data.main_notebook.radio_button_duplicates_hashmb.clone();
let radio_button_duplicates_hash = gui_data.main_notebook.radio_button_duplicates_hash.clone();
let radio_button_similar_images_minimal = gui_data.main_notebook.radio_button_similar_images_minimal.clone();
let radio_button_similar_images_very_small = gui_data.main_notebook.radio_button_similar_images_very_small.clone();
let radio_button_similar_images_small = gui_data.main_notebook.radio_button_similar_images_small.clone();
let radio_button_similar_images_medium = gui_data.main_notebook.radio_button_similar_images_medium.clone();
let radio_button_similar_images_high = gui_data.main_notebook.radio_button_similar_images_high.clone();
let radio_button_similar_images_very_high = gui_data.main_notebook.radio_button_similar_images_very_high.clone();
let scale_similarity = gui_data.main_notebook.scale_similarity.clone();
let entry_duplicate_minimal_size = gui_data.main_notebook.entry_duplicate_minimal_size.clone();
let stop_receiver = gui_data.stop_receiver.clone();
let entry_big_files_number = gui_data.main_notebook.entry_big_files_number.clone();
@ -270,22 +265,7 @@ pub fn connect_button_search(
let minimal_file_size = entry_similar_images_minimal_size.text().as_str().parse::<u64>().unwrap_or(1024 * 16);
let similarity;
if radio_button_similar_images_minimal.is_active() {
similarity = similar_images::Similarity::Minimal;
} else if radio_button_similar_images_very_small.is_active() {
similarity = similar_images::Similarity::VerySmall;
} else if radio_button_similar_images_small.is_active() {
similarity = similar_images::Similarity::Small;
} else if radio_button_similar_images_medium.is_active() {
similarity = similar_images::Similarity::Medium;
} else if radio_button_similar_images_high.is_active() {
similarity = similar_images::Similarity::High;
} else if radio_button_similar_images_very_high.is_active() {
similarity = similar_images::Similarity::VeryHigh;
} else {
panic!("No radio button is pressed");
}
let similarity = similar_images::Similarity::Similar(scale_similarity.value() as u64);
let futures_sender_similar_images = futures_sender_similar_images.clone();
// Find similar images

View file

@ -7,6 +7,7 @@ use crate::notebook_enums::*;
use chrono::NaiveDateTime;
use czkawka_core::duplicate::CheckingMethod;
use czkawka_core::same_music::MusicSimilarity;
use czkawka_core::similar_images;
use glib::Receiver;
use gtk::prelude::*;
use std::path::PathBuf;
@ -522,7 +523,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let values: [(u32, &dyn ToValue); 12] = [
(0, &true),
(1, &false),
(2, &(get_text_from_similarity(&file_entry.similarity).to_string())),
(2, &(similar_images::get_string_from_similarity(&file_entry.similarity).to_string())),
(3, &file_entry.size.file_size(options::BINARY).unwrap()),
(4, &file_entry.size),
(5, &file_entry.dimensions),

View file

@ -46,12 +46,7 @@ pub struct GuiMainNotebook {
pub radio_button_duplicates_hashmb: gtk::RadioButton,
pub radio_button_duplicates_hash: gtk::RadioButton,
pub radio_button_similar_images_minimal: gtk::RadioButton,
pub radio_button_similar_images_very_small: gtk::RadioButton,
pub radio_button_similar_images_small: gtk::RadioButton,
pub radio_button_similar_images_medium: gtk::RadioButton,
pub radio_button_similar_images_high: gtk::RadioButton,
pub radio_button_similar_images_very_high: gtk::RadioButton,
pub scale_similarity: gtk::Scale,
pub radio_button_hash_type_blake3: gtk::RadioButton,
pub radio_button_hash_type_crc32: gtk::RadioButton,
@ -104,12 +99,7 @@ impl GuiMainNotebook {
let radio_button_duplicates_hashmb: gtk::RadioButton = builder.object("radio_button_duplicates_hashmb").unwrap();
let radio_button_duplicates_hash: gtk::RadioButton = builder.object("radio_button_duplicates_hash").unwrap();
let radio_button_similar_images_minimal: gtk::RadioButton = builder.object("radio_button_similar_images_minimal").unwrap();
let radio_button_similar_images_very_small: gtk::RadioButton = builder.object("radio_button_similar_images_very_small").unwrap();
let radio_button_similar_images_small: gtk::RadioButton = builder.object("radio_button_similar_images_small").unwrap();
let radio_button_similar_images_medium: gtk::RadioButton = builder.object("radio_button_similar_images_medium").unwrap();
let radio_button_similar_images_high: gtk::RadioButton = builder.object("radio_button_similar_images_high").unwrap();
let radio_button_similar_images_very_high: gtk::RadioButton = builder.object("radio_button_similar_images_very_high").unwrap();
let scale_similarity: gtk::Scale = builder.object("scale_similarity").unwrap();
let radio_button_hash_type_blake3: gtk::RadioButton = builder.object("radio_button_hash_type_blake3").unwrap();
let radio_button_hash_type_crc32: gtk::RadioButton = builder.object("radio_button_hash_type_crc32").unwrap();
@ -152,12 +142,7 @@ impl GuiMainNotebook {
radio_button_duplicates_size,
radio_button_duplicates_hashmb,
radio_button_duplicates_hash,
radio_button_similar_images_minimal,
radio_button_similar_images_very_small,
radio_button_similar_images_small,
radio_button_similar_images_medium,
radio_button_similar_images_high,
radio_button_similar_images_very_high,
scale_similarity,
radio_button_hash_type_blake3,
radio_button_hash_type_crc32,
radio_button_hash_type_xxh3,

View file

@ -7,7 +7,7 @@ use czkawka_core::empty_folder::EmptyFolder;
use czkawka_core::invalid_symlinks;
use czkawka_core::invalid_symlinks::InvalidSymlinks;
use czkawka_core::same_music::SameMusic;
use czkawka_core::similar_images::{SimilarImages, Similarity};
use czkawka_core::similar_images::SimilarImages;
use czkawka_core::temporary::Temporary;
use czkawka_core::zeroed::ZeroedFiles;
use gtk::prelude::*;
@ -258,28 +258,6 @@ pub fn hide_all_buttons(buttons_array: &[gtk::Button]) {
}
}
// pub fn hide_all_buttons_except(except_name: &str, buttons_array: &[gtk::Button], button_names: &[String]) {
// for (index, button) in buttons_array.iter().enumerate() {
// if except_name == button_names[index] {
// button.show();
// } else {
// button.hide();
// }
// }
// }
pub fn get_text_from_similarity(similarity: &Similarity) -> &str {
match similarity {
Similarity::None => "Original",
Similarity::Minimal => "Minimal",
Similarity::VerySmall => "Very Small",
Similarity::Small => "Small",
Similarity::Medium => "Medium",
Similarity::High => "High",
Similarity::VeryHigh => "Very High",
}
}
pub fn get_text_from_invalid_symlink_cause(error: &invalid_symlinks::ErrorType) -> &str {
match error {
invalid_symlinks::ErrorType::InfiniteRecursion => "Infinite recursion",

View file

@ -48,6 +48,14 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
let check_button_settings_show_preview_similar_images = gui_data.settings.check_button_settings_show_preview_similar_images.clone();
let text_view_errors = gui_data.text_view_errors.clone();
let scale_similarity = gui_data.main_notebook.scale_similarity.clone();
// Set step increment
{
scale_similarity.set_range(0_f64, 12_f64);
scale_similarity.adjustment().set_step_increment(1_f64);
}
// Set Main Scrolled Window Treeviews
{
// Duplicate Files

View file

@ -32,6 +32,11 @@ Author: Rafał Mikrut
<!-- interface-name Czkawka -->
<!-- interface-description Czkawka is simple and fast app to find duplicates, empty folders, similar images etc. -->
<!-- interface-authors Rafa\305\202 Mikrut -->
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">100</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkWindow" id="window_main">
<property name="can-focus">False</property>
<property name="default-width">1100</property>
@ -1075,13 +1080,10 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_similar_images_minimal">
<property name="label" translatable="yes">Minimal</property>
<object class="GtkLabel">
<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_similar_images_very_high</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes"> Very High </property>
</object>
<packing>
<property name="expand">False</property>
@ -1090,28 +1092,25 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_similar_images_very_small">
<property name="label" translatable="yes">Very Small</property>
<object class="GtkScale" id="scale_similarity">
<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_similar_images_very_high</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
<property name="digits">0</property>
<property name="value-pos">right</property>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_similar_images_small">
<property name="label" translatable="yes">Small</property>
<object class="GtkLabel">
<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_similar_images_very_high</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes"> Minimal </property>
</object>
<packing>
<property name="expand">False</property>
@ -1119,51 +1118,6 @@ Author: Rafał Mikrut
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_similar_images_medium">
<property name="label" translatable="yes">Medium</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_similar_images_very_high</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_similar_images_high">
<property name="label" translatable="yes">High</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_similar_images_very_high</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radio_button_similar_images_very_high">
<property name="label" translatable="yes">Very High</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">6</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>