Repository: qarmin/czkawka (language: rust)

Issue:
Arrow keys/spacebar not working in Duplicate Files selection table in Krokiet 7.0.0 Windows 
**Steps to reproduce:**
- do a Duplicate Files scan
- mouse-click on a checkbox to highlight a file
- hit spacebar => this does not toggle the status of the checkbox
- hit up-arrow => this does not change focus to the prior line
- hit down-arrow => this does not change focus to the next line

<details>
In Czkawka on Windows it is possible to use arrow-up, arrow down to progress through files in the Duplicate Files list.
And the spacebar can be used to flip the status of checkbox. This functionality is missing from Krokiet 7.0.0 Windows, resulting in drastically reduced functionality when deduplicating large numbers of files.

</details>

**System**

- Krokiet version: 7.0.0 Windows 
- OS version: Windows 10
- Installation method: run directly 



Discussion / hints:
Meaningful bug - it takes so long to select items from a list.

Fix patch:
diff --git a/Changelog.md b/Changelog.md
index c8a698589..094902e77 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -2,9 +2,15 @@
 
 ### Breaking changes
 
-- Due removing image_type from image struct, old cache files are incompatible with new version and should be regenerated
+- Due to the removal image_type from image struct, old cache files are incompatible with new version and should be
+  regenerated
   from scratch(it uses new name)
 
+### Known regressions
+
+- Slint 1.8 which Krokiet uses requires femtovg 0.9.2 which broke font
+  rendering - https://github.com/slint-ui/slint/issues/6298
+
 ### Core
 
 - Removed some unnecessary panics - [#1354](https://github.com/qarmin/czkawka/pull/1354)
@@ -26,7 +32,7 @@
 - Added avif support(via external C library, not enabled by
   default) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
 - Integer overflow are enabled by default(prepare for reporting bugs, slower performance and
-  unstability) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
+  general unstability) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
 - Fixed crash when loading invalid image cache - [#1230](https://github.com/qarmin/czkawka/pull/1230)
 
 ### Krokiet
@@ -34,6 +40,14 @@
 - Fixed invalid default hash size in similar images - [#1354](https://github.com/qarmin/czkawka/pull/1354)
 - Fixed and added more input parameters to the application - [#1354](https://github.com/qarmin/czkawka/pull/1354)
 - Fixed problem with loading invalid preset - [#1226](https://github.com/qarmin/czkawka/pull/1226)
+- Fixed crash when using 8 hash size with small similarity - [#1359](https://github.com/qarmin/czkawka/pull/1359)
+- Disabling buttons when no files were found - [#1359](https://github.com/qarmin/czkawka/pull/1359)
+- Changed way to close/open panel at bottom - [#1359](https://github.com/qarmin/czkawka/pull/1359)
+- Modify logo a little - [#1359](https://github.com/qarmin/czkawka/pull/1359)
+- Avoid errors when trying to load preview of not supported file - [#1359](https://github.com/qarmin/czkawka/pull/1359)
+- Added ability to show preview of referenced folders - [#1359](https://github.com/qarmin/czkawka/pull/1359)
+- Enable selecting with space and jumping over entries with
+  arrows and opening with enter - [#1359](https://github.com/qarmin/czkawka/pull/1359)
 
 ### GTK GUI
 
@@ -47,7 +61,7 @@
 
 - Added options to find/remove images by size - [#1255](https://github.com/qarmin/czkawka/pull/1255)
 - Fixed and added more input parameters to the application - [#1354](https://github.com/qarmin/czkawka/pull/1354)
-- Fixed crash when stopping scan mutliple times - [#1355](https://github.com/qarmin/czkawka/pull/1355)
+- Fixed crash when stopping scan multiple times - [#1355](https://github.com/qarmin/czkawka/pull/1355)
 - Print results also in debug build - [#1355](https://github.com/qarmin/czkawka/pull/1355)
 
 ## Version 7.0.0 - 19.02.2024r
diff --git a/czkawka_core/src/common_image.rs b/czkawka_core/src/common_image.rs
index d0fdbc482..73f7be417 100644
--- a/czkawka_core/src/common_image.rs
+++ b/czkawka_core/src/common_image.rs
@@ -29,7 +29,7 @@ use rawloader::RawLoader;
 use symphonia::core::conv::IntoSample;
 
 use crate::common;
-use crate::common::{create_crash_message, HEIC_EXTENSIONS, JXL_IMAGE_EXTENSIONS, RAW_IMAGE_EXTENSIONS};
+use crate::common::{create_crash_message, HEIC_EXTENSIONS, IMAGE_RS_EXTENSIONS, IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, JXL_IMAGE_EXTENSIONS, RAW_IMAGE_EXTENSIONS};
 // #[cfg(feature = "heif")]
 // use libheif_rs::LibHeif;
 
@@ -171,3 +171,17 @@ pub fn get_raw_image(path: impl AsRef<Path> + std::fmt::Debug) -> Result<Dynamic
     debug!("Loading raw image --- {str_timer}");
     Ok(res)
 }
+
+pub fn check_if_can_display_image(path: &str) -> bool {
+    let Some(extension) = Path::new(path).extension() else {
+        return false;
+    };
+    let extension_str = extension.to_string_lossy().to_lowercase();
+    #[cfg(feature = "heif")]
+    let allowed_extensions = &[IMAGE_RS_EXTENSIONS, RAW_IMAGE_EXTENSIONS, JXL_IMAGE_EXTENSIONS, HEIC_EXTENSIONS].concat();
+
+    #[cfg(not(feature = "heif"))]
+    let allowed_extensions = &[IMAGE_RS_EXTENSIONS, RAW_IMAGE_EXTENSIONS, JXL_IMAGE_EXTENSIONS].concat();
+
+    allowed_extensions.iter().any(|ext| extension_str.ends_with(ext))
+}
diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs
index 77c8a1143..e77a6dd19 100644
--- a/czkawka_core/src/similar_images.rs
+++ b/czkawka_core/src/similar_images.rs
@@ -29,8 +29,11 @@ use crate::progress_data::{CurrentStage, ProgressData};
 
 type ImHash = Vec<u8>;
 
+// 40 is, similar like previous 20 in 8 hash size is useless
+// But since Krowka have problems with proper changing max value in fly
+// hardcode 40 as max value
 pub const SIMILAR_VALUES: [[u32; 6]; 4] = [
-    [1, 2, 5, 7, 14, 20],    // 8
+    [1, 2, 5, 7, 14, 40],    // 8
     [2, 5, 15, 30, 40, 40],  // 16
     [4, 10, 20, 40, 40, 40], // 32
     [6, 20, 40, 40, 40, 40], // 64
@@ -357,7 +360,6 @@ impl SimilarImages {
             .hash_alg(self.get_params().hash_alg)
             .resize_filter(self.get_params().image_filter);
         let hasher = hasher_config.to_hasher();
-
         let hash = hasher.hash_image(&img);
         file_entry.hash = hash.as_bytes().to_vec();
 
@@ -818,7 +820,7 @@ pub fn get_string_from_similarity(similarity: &u32, hash_size: u8) -> String {
     } else if *similarity <= SIMILAR_VALUES[index_preset][5] {
         flc!("core_similarity_minimal")
     } else {
-        panic!();
+        panic!("Invalid similarity value {similarity} for hash size {hash_size} (index {index_preset})");
     }
 }
 
diff --git a/krokiet/README.md b/krokiet/README.md
index de73d6f81..523a796d9 100644
--- a/krokiet/README.md
+++ b/krokiet/README.md
@@ -81,6 +81,15 @@ should print something like
 Slint: Build config: debug; Backend: software
 ```
 
+## Scaling application
+
+If you have high DPI monitor, you may want to scale application. You can do it by setting `SLINT_SCALE_FACTOR`
+environment
+
+```
+SLINT_SCALE_FACTOR=2 cargo run 
+```
+
 ## Different theme
 
 App was created with dark fluent theme in mind, but is possible to use light theme by setting `SLINT_STYLE` environment
diff --git a/krokiet/icons/krokiet_delete.svg b/krokiet/icons/krokiet_delete.svg
new file mode 100644
index 000000000..0a420d816
--- /dev/null
+++ b/krokiet/icons/krokiet_delete.svg
@@ -0,0 +1,1 @@
+<svg enable-background="new 0 0 512 512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m251.09789 472.84735c-116.86793 0-211.945238-95.07731-211.945238-211.94524s95.077308-211.945239 211.945238-211.945239 211.94524 95.077309 211.94524 211.945239-95.07731 211.94524-211.94524 211.94524zm0-406.371881c-107.20621 0-194.42664 87.220441-194.42664 194.426641 0 107.20621 87.22043 194.42664 194.42664 194.42664 107.2062 0 194.42664-87.22043 194.42664-194.42664 0-107.2062-87.22044-194.426641-194.42664-194.426641z" stroke-width=".827911"/><path d="m372.64648 229.92167h-240.74591v65.12515h240.74591z" stroke-width="1.02186"/></svg>
\ No newline at end of file
diff --git a/krokiet/icons/krokiet_move.svg b/krokiet/icons/krokiet_move.svg
new file mode 100644
index 000000000..02d395b60
--- /dev/null
+++ b/krokiet/icons/krokiet_move.svg
@@ -0,0 +1,1 @@
+<svg enable-background="new 0 0 512 512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m512 164.379v258.695c0 28.231-22.969 51.2-51.2 51.2h-409.6c-28.231 0-51.2-22.969-51.2-51.2v-183.242c0-1.299.049-2.586.144-3.862-.094-.495 3.4314235 78.12995-.144-1.528-12.945347-288.413346 89.381493-161.580916 460.8-121.263 28.06613 3.04661 51.2 22.969 51.2 51.2zm-463.495 24.323c.894-.047 1.79-.07 2.695-.07zm447.327-24.323c0-19.317-15.715-35.032-35.032-35.032l-444.374512 1.52394-.257488 278.72906v13.474c0 19.317 15.715 35.032 35.032 35.032h409.6c19.317 0 35.032-15.715 35.032-35.032z"/></svg>
\ No newline at end of file
diff --git a/krokiet/icons/krokiet_search.svg b/krokiet/icons/krokiet_search.svg
new file mode 100644
index 000000000..32d11dbb2
--- /dev/null
+++ b/krokiet/icons/krokiet_search.svg
@@ -0,0 +1,1 @@
+<svg clip-rule="evenodd" fill-rule="evenodd" height="2048" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 2048 2048" width="2048" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero"><path d="m405 407c100-100 231-150 362-150s262 50 362 150 150 231 150 362-50 262-150 362-231 150-362 150-262-50-362-150-150-231-150-362 50-262 150-362zm362-86c-115 0-229 44-317 131-87 87-131 202-131 317s44 229 131 317c87 87 202 131 317 131s229-44 317-131c87-87 131-202 131-317s-44-229-131-317c-87-87-202-131-317-131z"/><path d="m1161 1066 444 444-92 90-444-444z" stroke-width="2"/></g><path d="m0 0h2048v2048h-2048z" fill="none"/></svg>
\ No newline at end of file
diff --git a/krokiet/icons/krokiet_select.svg b/krokiet/icons/krokiet_select.svg
new file mode 100644
index 000000000..e9be3889b
--- /dev/null
+++ b/krokiet/icons/krokiet_select.svg
@@ -0,0 +1,1 @@
+<svg enable-background="new 0 0 256 256" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><text/><path d="m88.762429 63.360798s-.422221 3.866804 1.564925 14.586544c.702752 3.791076 1.755116 8.245298 3.305133 12.476376.746597 2.038002 1.623507 4.065074 2.655645 5.960422 1.019612 1.872363 2.214311 3.65987 3.622478 5.21535 1.41229 1.55999 3.06238 2.91163 4.98677 3.86575 1.9601.97182 4.13058 1.49307 6.48306 1.45457 2.39714-.0393 4.86216-.65723 7.35925-1.80738 2.58382-1.1901 5.18603-2.9417 7.79784-5.191517 5.76675-4.967507 11.58647-12.371239 17.35185-21.488295 7.58688-11.997444 14.68709-26.35706 20.48863-39.477373 0 0-5.64097-3.03885-5.64097-3.03885s-5.64096-3.038852-5.64096-3.038852c-5.71885 12.933369-12.19317 26.718281-18.91857 38.402125-5.11472 8.885674-9.85335 15.642247-14.17638 20.178223-1.93003 2.025082-3.68252 3.507311-5.26449 4.54966-1.51207.996293-2.85107 1.579658-4.03668 1.865955-1.15181.278137-2.25333.299771-3.34763.05507-1.09846-.245557-2.22523-.768213-3.3798-1.611286-1.15559-.843802-2.28711-1.971265-3.38107-3.344183-1.103294-1.384656-2.133049-2.974344-3.086024-4.686454-1.985446-3.567097-3.576614-7.554834-4.796996-11.098968-3.437201-9.981995-3.946011-13.826957-3.946011-13.826957z" stroke-width="1.64865"/><g stroke-width="1.52107"><path d="m166.32011 17.387035h12.277943v104.96534h-12.277943z"/><path d="m73.619453 17.351675h12.277943v104.96534h-12.277943z"/><path d="m17.369175-178.59412h12.277943v104.96534h-12.277943z" transform="rotate(90)"/><path d="m110.02438-178.60258h12.277943v104.96534h-12.277943z" transform="rotate(90)"/><path d="m167.52612 131.14308h12.277943v104.96534h-12.277943z"/><path d="m74.82547 131.10773h12.277943v104.96534h-12.277943z"/><path d="m131.12523-179.80013h12.277943v104.96534h-12.277943z" transform="rotate(90)"/><path d="m223.78044-179.80859h12.277943v104.96534h-12.277943z" transform="rotate(90)"/></g></svg>
\ No newline at end of file
diff --git a/krokiet/icons/krokiet_stop.svg b/krokiet/icons/krokiet_stop.svg
new file mode 100644
index 000000000..1a22aeb34
--- /dev/null
+++ b/krokiet/icons/krokiet_stop.svg
@@ -0,0 +1,1 @@
+<svg enable-background="new 0 0 512 512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m253.67845 460.24602c-111.34242 0-201.924473-90.58205-201.924473-201.92447s90.582053-201.924472 201.924473-201.924472 201.92447 90.582052 201.92447 201.924472-90.58205 201.92447-201.92447 201.92447zm0-387.158623c-102.1375 0-185.234153 83.096653-185.234153 185.234153s83.096653 185.23415 185.234153 185.23415 185.23415-83.09665 185.23415-185.23415-83.09665-185.234153-185.23415-185.234153z" stroke-width=".788767"/><g transform="matrix(.55777203 .55771362 -.55771362 .55777203 258.08847 -28.27187)"><path d="m96.446 234.14h327.87v55.947h-327.87z"/><path d="m98.184-288.35h327.87v55.947h-327.87z" transform="rotate(90)"/></g></svg>
\ No newline at end of file
diff --git a/krokiet/icons/logo.png b/krokiet/icons/logo.png
index 20230dc8b..d016c5392 100644
Binary files a/krokiet/icons/logo.png and b/krokiet/icons/logo.png differ
diff --git a/krokiet/icons/logo_small.png b/krokiet/icons/logo_small.png
new file mode 100644
index 000000000..b1d1e0632
Binary files /dev/null and b/krokiet/icons/logo_small.png differ
diff --git a/krokiet/icons/settings.svg b/krokiet/icons/settings.svg
index 64597bb03..ee20ffbea 100644
--- a/krokiet/icons/settings.svg
+++ b/krokiet/icons/settings.svg
@@ -1,5 +1,1 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m296 186.72a80 80 0 1 0 29.282 109.28 80.24 80.24 0 0 0-29.282-109.28zm109.58 155.64a165.53 165.53 0 0 1-12.59 18.527l23.107 57.358a11.59 11.59 0 0 1-5.1124 14.115l-79.649 45.836a11.64 11.64 0 0 1-14.711-2.8005l-38.08-48.544a176.56 176.56 0 0 1-44.954 0.2228l-37.803 48.357a11.93 11.93 0 0 1-14.898 2.784l-79.778-46.06a12 12 0 0 1-5.203-14.008l22.977-56.917a169.3 169.3 0 0 1-22.274-39.06l-61.08-8.7064a11.64 11.64 0 0 1-9.7856-11.331l-0.13413-91.888a11.59 11.59 0 0 1 9.6676-11.485l61.227-8.6679a174.58 174.58 0 0 1 9.9147-20.453 165.53 165.53 0 0 1 12.59-18.527l-23.107-57.358a11.59 11.59 0 0 1 5.1124-14.115l79.649-45.836a11.64 11.64 0 0 1 14.711 2.8005l38.08 48.544a176.56 176.56 0 0 1 44.954-0.2228l37.803-48.357a11.93 11.93 0 0 1 14.898-2.784l79.778 46.06a12 12 0 0 1 5.203 14.008l-22.977 56.917a169.3 169.3 0 0 1 22.317 39.085l61.037 8.6814a11.64 11.64 0 0 1 9.7856 11.331l0.12913 91.896a11.59 11.59 0 0 1-9.6676 11.485l-61.227 8.6679a174.58 174.58 0 0 1-9.9097 20.444z"/>
-</svg>
-
+<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m296 186.72a80 80 0 1 0 29.282 109.28 80.24 80.24 0 0 0 -29.282-109.28zm109.58 155.64a165.53 165.53 0 0 1 -12.59 18.527l23.107 57.358a11.59 11.59 0 0 1 -5.1124 14.115l-79.649 45.836a11.64 11.64 0 0 1 -14.711-2.8005l-38.08-48.544a176.56 176.56 0 0 1 -44.954.2228l-37.803 48.357a11.93 11.93 0 0 1 -14.898 2.784l-79.778-46.06a12 12 0 0 1 -5.203-14.008l22.977-56.917a169.3 169.3 0 0 1 -22.274-39.06l-61.08-8.7064a11.64 11.64 0 0 1 -9.7856-11.331l-.13413-91.888a11.59 11.59 0 0 1 9.6676-11.485l61.227-8.6679a174.58 174.58 0 0 1 9.9147-20.453 165.53 165.53 0 0 1 12.59-18.527l-23.107-57.358a11.59 11.59 0 0 1 5.1124-14.115l79.649-45.836a11.64 11.64 0 0 1 14.711 2.8005l38.08 48.544a176.56 176.56 0 0 1 44.954-.2228l37.803-48.357a11.93 11.93 0 0 1 14.898-2.784l79.778 46.06a12 12 0 0 1 5.203 14.008l-22.977 56.917a169.3 169.3 0 0 1 22.317 39.085l61.037 8.6814a11.64 11.64 0 0 1 9.7856 11.331l.12913 91.896a11.59 11.59 0 0 1 -9.6676 11.485l-61.227 8.6679a174.58 174.58 0 0 1 -9.9097 20.444z"/></svg>
\ No newline at end of file
diff --git a/krokiet/icons/subsettings.svg b/krokiet/icons/subsettings.svg
index 62007e647..45e04f91c 100644
--- a/krokiet/icons/subsettings.svg
+++ b/krokiet/icons/subsettings.svg
@@ -1,17 +1,1 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m259.96 178.63c-116.38 0.46054-109.81 154.42-4.8963 157.07 110.82 2.7975 108.63-157.48 4.8963-157.07zm-4.5114 238.17-59.661 58.623c-3.663 4.3684-9.9047 5.5348-14.898 2.784l-79.778-46.06c-4.7847-2.888-6.9422-8.6968-5.203-14.008l22.977-56.917c-9.1283-11.972-16.619-25.108-22.274-39.06l-61.08-8.7064c-5.5804-0.89998-9.7077-5.679-9.7856-11.331l-0.13413-91.888c-0.02721-5.6801 4.0661-10.543 9.6676-11.485l61.227-8.6679c2.8571-7.0258 6.169-13.858 9.9147-20.453 3.7735-6.4529 7.9798-12.643 12.59-18.527l-23.107-57.358c-1.985-5.3221 0.17966-11.298 5.1124-14.115l79.649-45.836c4.933-2.7634 11.138-1.5821 14.711 2.8005l66.966 73.793c-6.8372 161.75-1.2386 214.48-6.8946 306.41z"/>
-<rect x="275" y="50" width="200" height="20" stroke-width=".8921"/>
-<rect x="275" y="85" width="200" height="20" stroke-width=".8921"/>
-<rect x="275" y="120" width="200" height="20" stroke-width=".8921"/>
-<rect x="275" y="155" width="200" height="20" stroke-width=".8921"/>
-<rect x="335" y="190" width="140" height="20" stroke-width=".74638"/>
-<rect x="345" y="225" width="130" height="20" stroke-width=".71923"/>
-<rect transform="scale(1,-1)" x="273.16" y="-466.69" width="199.81" height="20" stroke-width=".89168"/>
-<rect transform="scale(1,-1)" x="273.16" y="-431.69" width="199.81" height="20" stroke-width=".89168"/>
-<rect transform="scale(1,-1)" x="273.16" y="-396.69" width="199.81" height="20" stroke-width=".89168"/>
-<rect transform="scale(1,-1)" x="273.16" y="-361.69" width="199.81" height="20" stroke-width=".89168"/>
-<rect transform="scale(1,-1)" x="333.1" y="-326.69" width="139.87" height="20" stroke-width=".74603"/>
-<rect transform="scale(1,-1)" x="343.09" y="-291.69" width="129.88" height="20" stroke-width=".71889"/>
-</svg>
-
+<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m259.96 178.63c-116.38.46054-109.81 154.42-4.8963 157.07 110.82 2.7975 108.63-157.48 4.8963-157.07zm-4.5114 238.17-59.661 58.623c-3.663 4.3684-9.9047 5.5348-14.898 2.784l-79.778-46.06c-4.7847-2.888-6.9422-8.6968-5.203-14.008l22.977-56.917c-9.1283-11.972-16.619-25.108-22.274-39.06l-61.08-8.7064c-5.5804-.89998-9.7077-5.679-9.7856-11.331l-.13413-91.888c-.02721-5.6801 4.0661-10.543 9.6676-11.485l61.227-8.6679c2.8571-7.0258 6.169-13.858 9.9147-20.453 3.7735-6.4529 7.9798-12.643 12.59-18.527l-23.107-57.358c-1.985-5.3221.17966-11.298 5.1124-14.115l79.649-45.836c4.933-2.7634 11.138-1.5821 14.711 2.8005l66.966 73.793c-6.8372 161.75-1.2386 214.48-6.8946 306.41z"/><path d="m275 50h200v20h-200z" stroke-width=".8921"/><path d="m275 85h200v20h-200z" stroke-width=".8921"/><path d="m275 120h200v20h-200z" stroke-width=".8921"/><path d="m275 155h200v20h-200z" stroke-width=".8921"/><path d="m335 190h140v20h-140z" stroke-width=".74638"/><path d="m345 225h130v20h-130z" stroke-width=".71923"/><g transform="scale(1 -1)"><path d="m273.16-466.69h199.81v20h-199.81z" stroke-width=".89168"/><path d="m273.16-431.69h199.81v20h-199.81z" stroke-width=".89168"/><path d="m273.16-396.69h199.81v20h-199.81z" stroke-width=".89168"/><path d="m273.16-361.69h199.81v20h-199.81z" stroke-width=".89168"/><path d="m333.1-326.69h139.87v20h-139.87z" stroke-width=".74603"/><path d="m343.09-291.69h129.88v20h-129.88z" stroke-width=".71889"/></g></svg>
\ No newline at end of file
diff --git a/krokiet/src/common.rs b/krokiet/src/common.rs
index d6ece412d..09c9c34b8 100644
--- a/krokiet/src/common.rs
+++ b/krokiet/src/common.rs
@@ -374,6 +374,11 @@ pub fn create_excluded_directories_model_from_pathbuf(items: &[PathBuf]) -> Mode
     ModelRc::new(VecModel::from(converted))
 }
 
+pub fn check_if_there_are_any_included_folders(app: &MainWindow) -> bool {
+    let included = app.global::<Settings>().get_included_directories_model();
+    included.iter().count() > 0
+}
+
 pub fn check_if_all_included_dirs_are_referenced(app: &MainWindow) -> bool {
     let included = app.global::<Settings>().get_included_directories_model();
     included.iter().all(|x| x.referenced_folder)
diff --git a/krokiet/src/connect_scan.rs b/krokiet/src/connect_scan.rs
index 05b63cefd..a618b743a 100644
--- a/krokiet/src/connect_scan.rs
+++ b/krokiet/src/connect_scan.rs
@@ -24,7 +24,7 @@ use humansize::{format_size, BINARY};
 use rayon::prelude::*;
 use slint::{ComponentHandle, ModelRc, SharedString, VecModel, Weak};
 
-use crate::common::{check_if_all_included_dirs_are_referenced, split_u64_into_i32s};
+use crate::common::{check_if_all_included_dirs_are_referenced, check_if_there_are_any_included_folders, split_u64_into_i32s};
 use crate::settings::{
     collect_settings, get_audio_check_type_idx, get_biggest_item_idx, get_duplicates_check_method_idx, get_duplicates_hash_type_idx, get_image_hash_alg_idx,
     get_resize_algorithm_idx, SettingsCustom, ALLOWED_AUDIO_CHECK_TYPE_VALUES, ALLOWED_BIG_FILE_SIZE_VALUES, ALLOWED_DUPLICATES_CHECK_METHOD_VALUES,
@@ -37,6 +37,11 @@ pub fn connect_scan_button(app: &MainWindow, progress_sender: Sender<ProgressDat
     app.on_scan_starting(move |active_tab| {
         let app = a.upgrade().expect("Failed to upgrade app :(");
 
+        if !check_if_there_are_any_included_folders(&app) {
+            app.invoke_scan_ended("Cannot start scan when no included directories are set.".into());
+            return;
+        }
+
         if check_if_all_included_dirs_are_referenced(&app) {
             app.invoke_scan_ended("Cannot start scan when all included directories are set as referenced folders.".into());
             return;
diff --git a/krokiet/src/connect_show_preview.rs b/krokiet/src/connect_show_preview.rs
index b7d00aab9..f3527a616 100644
--- a/krokiet/src/connect_show_preview.rs
+++ b/krokiet/src/connect_show_preview.rs
@@ -1,7 +1,7 @@
 use std::path::Path;
 use std::time::{Duration, Instant};
 
-use czkawka_core::common_image::get_dynamic_image_from_path;
+use czkawka_core::common_image::{check_if_can_display_image, get_dynamic_image_from_path};
 use image::DynamicImage;
 use log::{debug, error};
 use slint::ComponentHandle;
@@ -27,6 +27,11 @@ pub fn connect_show_preview(app: &MainWindow) {
             return;
         }
 
+        if !check_if_can_display_image(&image_path) {
+            set_preview_visible(&gui_state, None);
+            return;
+        }
+
         // Do not load the same image again
         if image_path == gui_state.get_preview_image_path() {
             return;
diff --git a/krokiet/ui/action_buttons.slint b/krokiet/ui/action_buttons.slint
index 71aba6b9c..8319eb383 100644
--- a/krokiet/ui/action_buttons.slint
+++ b/krokiet/ui/action_buttons.slint
@@ -5,15 +5,20 @@ import {CurrentTab} from "common.slint";
 import {BottomPanelVisibility} from "common.slint";
 import {Callabler} from "callabler.slint";
 import {GuiState} from "gui_state.slint";
+import {MainListModel} from "common.slint";
 
 export component VisibilityButton inherits Button {
     in-out property <BottomPanelVisibility> button_visibility;
     in-out property <BottomPanelVisibility> bottom_panel_visibility;
-    enabled: bottom_panel_visibility != button-visibility;
+    checked: bottom_panel_visibility == button_visibility;
     height: 30px;
     width: 70px;
     clicked => {
-        bottom-panel-visibility = button_visibility;
+        if (bottom_panel_visibility == button_visibility) {
+            bottom_panel_visibility = BottomPanelVisibility.NotVisible;
+        } else {
+            bottom_panel_visibility = button_visibility;
+        }
     }
 }
 
@@ -23,20 +28,78 @@ export component ActionButtons inherits HorizontalLayout {
     callback show_select_popup(length, length);
     callback show_remove_popup();
     callback request_folder_to_move();
+
+    in-out property <[MainListModel]> duplicate_files_model: [];
+    in-out property <[MainListModel]> empty_folder_model: [];
+    in-out property <[MainListModel]> big_files_model: [];
+    in-out property <[MainListModel]> empty_files_model: [];
+    in-out property <[MainListModel]> temporary_files_model: [];
+    in-out property <[MainListModel]> similar_images_model: [];
+    in-out property <[MainListModel]> similar_videos_model: [];
+    in-out property <[MainListModel]> similar_music_model: [];
+    in-out property <[MainListModel]> invalid_symlinks_model: [];
+    in-out property <[MainListModel]> broken_files_model: [];
+    in-out property <[MainListModel]> bad_extensions_model: [];
+
+    property <CurrentTab> active_tab: GuiState.active_tab;
+
     in-out property <BottomPanelVisibility> bottom_panel_visibility <=> GuiState.bottom_panel_visibility;
     in-out property <bool> stop_requested: false;
     in-out property <bool> scanning;
     in-out property <bool> lists_enabled: GuiState.is_tool_tab_active;
+    in-out property <bool> results_available: false;
     out property <int> name;
     height: 30px;
     spacing: 4px;
 
+    changed duplicate_files_model => {check_if_enable_buttons();}
+    changed empty_folder_model => {check_if_enable_buttons();}
+    changed big_files_model => {check_if_enable_buttons();}
+    changed empty_files_model => {check_if_enable_buttons();}
+    changed temporary_files_model => {check_if_enable_buttons();}
+    changed similar_images_model => {check_if_enable_buttons();}
+    changed similar_videos_model => {check_if_enable_buttons();}
+    changed similar_music_model => {check_if_enable_buttons();}
+    changed invalid_symlinks_model => {check_if_enable_buttons();}
+    changed broken_files_model => {check_if_enable_buttons();}
+    changed bad_extensions_model => {check_if_enable_buttons();}
+    changed active_tab => {check_if_enable_buttons();}
+
+    function check_if_enable_buttons() {
+        if (active_tab == CurrentTab.DuplicateFiles && duplicate_files_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.EmptyFolders && empty_folder_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.BigFiles && big_files_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.EmptyFiles && empty_files_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.TemporaryFiles && temporary_files_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.SimilarImages && similar_images_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.SimilarVideos && similar_videos_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.SimilarMusic && similar_music_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.InvalidSymlinks && invalid_symlinks_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.BrokenFiles && broken_files_model.length > 0) {
+            results_available = true;
+        } else if (active_tab == CurrentTab.BadExtensions && bad_extensions_model.length > 0) {
+            results_available = true;
+        } else {
+            results_available = false;
+        }
+    }
+
     Rectangle {
         scan_button := Button {
             height: parent.height;
             enabled: !scanning && lists_enabled;
             visible: !scanning && lists_enabled;
             text: "Scan";
+            icon: @image-url("../icons/krokiet_search.svg");
             clicked => {
                 root.scanning = true;
                 root.scan_starting(GuiState.active_tab);
@@ -48,6 +111,7 @@ export component ActionButtons inherits HorizontalLayout {
             visible: scanning;
             enabled: scanning && !stop_requested && root.lists_enabled;
             text: "Stop";
+            icon: @image-url("../icons/krokiet_stop.svg");
             clicked => {
                 root.scan_stopping();
                 root.stop_requested = true;
@@ -56,14 +120,15 @@ export component ActionButtons inherits HorizontalLayout {
     }
 
     Rectangle {
-        horizontal-stretch: 0.5;
+        max-width: 5px;
     }
 
     select_button := Button {
         visible: lists_enabled;
         height: parent.height;
-        enabled: !scanning && lists_enabled;
+        enabled: !scanning && lists_enabled && results_available;
         text: "Select";
+        icon: @image-url("../icons/krokiet_select.svg");
         clicked => {
             show_select_popup(self.x + self.width / 2, self.y + parent.y);
         }
@@ -72,8 +137,9 @@ export component ActionButtons inherits HorizontalLayout {
     move_button := Button {
         visible: lists_enabled;
         height: parent.height;
-        enabled: !scanning && lists_enabled;
+        enabled: !scanning && lists_enabled && results_available;
         text: "Move";
+        icon: @image-url("../icons/krokiet_move.svg");
         clicked => {
             request_folder_to_move();
         }
@@ -82,8 +148,9 @@ export component ActionButtons inherits HorizontalLayout {
     delete_button := Button {
         visible: lists_enabled;
         height: parent.height;
-        enabled: !scanning && lists_enabled;
+        enabled: !scanning && lists_enabled && results_available;
         text: "Delete";
+        icon: @image-url("../icons/krokiet_delete.svg");
         clicked => {
             show_remove_popup();
         }
@@ -98,23 +165,16 @@ export component ActionButtons inherits HorizontalLayout {
         spacing: 0px;
         VisibilityButton {
             height: parent.height;
-            button-visibility: BottomPanelVisibility.Directories;
+            button_visibility: BottomPanelVisibility.Directories;
             bottom_panel_visibility <=> bottom_panel_visibility;
             text: "Dirs";
         }
 
         VisibilityButton {
             height: parent.height;
-            button-visibility: BottomPanelVisibility.TextErrors;
-            bottom_panel_visibility <=> bottom_panel_visibility;
-            text: "Text";
-        }
-
-        VisibilityButton {
-            height: parent.height;
-            button-visibility: BottomPanelVisibility.NotVisible;
+            button_visibility: BottomPanelVisibility.TextErrors;
             bottom_panel_visibility <=> bottom_panel_visibility;
-            text: "None";
+            text: "Output";
         }
     }
 }
diff --git a/krokiet/ui/bottom_panel.slint b/krokiet/ui/bottom_panel.slint
index 3e0bd6acb..bdfd7fa86 100644
--- a/krokiet/ui/bottom_panel.slint
+++ b/krokiet/ui/bottom_panel.slint
@@ -105,20 +105,20 @@ export component BottomPanel {
     in-out property <BottomPanelVisibility> bottom_panel_visibility: BottomPanelVisibility.Directories;
     callback folder_choose_requested(bool);
     callback show_manual_add_dialog(bool);
-    min-height: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 150px;
-    min-width: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 400px;
-    if bottom-panel-visibility == BottomPanelVisibility.Directories: DirectoriesPanel {
+    min-height: bottom_panel_visibility == BottomPanelVisibility.NotVisible ? 0px : 150px;
+    min-width: bottom_panel_visibility == BottomPanelVisibility.NotVisible ? 0px : 400px;
+    if bottom_panel_visibility == BottomPanelVisibility.Directories: DirectoriesPanel {
         width: parent.width;
         height: parent.height;
-        folder_choose_requested(included-directories) => {
-            root.folder_choose_requested(included-directories)
+        folder_choose_requested(included_directories) => {
+            root.folder_choose_requested(included_directories)
         }
-        show_manual_add_dialog(included-directories) => {
-            root.show_manual_add_dialog(included-directories)
+        show_manual_add_dialog(included_directories) => {
+            root.show_manual_add_dialog(included_directories)
         }
     }
 
-    if bottom-panel-visibility == BottomPanelVisibility.TextErrors: TextErrorsPanel {
+    if bottom_panel_visibility == BottomPanelVisibility.TextErrors: TextErrorsPanel {
         width: parent.width;
         height: parent.height;
     }
diff --git a/krokiet/ui/color_palette.slint b/krokiet/ui/color_palette.slint
index 4a0bada3f..35d7bc64a 100644
--- a/krokiet/ui/color_palette.slint
+++ b/krokiet/ui/color_palette.slint
@@ -6,9 +6,30 @@ export global ColorPalette {
     in-out property <color> tab_selected_color: dark_scheme ? #353535 : #5e5e5e;
     in-out property <color> tab_hovered_color: dark_scheme ? #49494926 : #80808014;
     // ListView
-    in-out property <color> list_view_normal_color: dark_scheme ? #222222 : #dddddd;
-    in-out property <color> list_view_normal_header_color: dark_scheme ? #111111 : #888888;
-    in-out property <color> list_view_normal_selected_header: dark_scheme ? #444444 : #cccccc;
+    in-out property <color> list_view_item_color: dark_scheme ? #222222 : #dddddd;
+    in-out property <color> list_view_item_hovered_color: dark_scheme ? #333333 : #d2d2d2;
+    in-out property <color> list_view_item_selected_color: dark_scheme ? #444444 : #cccccc;
+    in-out property <color> list_view_item_selected_hovered_color: dark_scheme ? #555555 : #bbbbbb;
+
+    in-out property <color> list_view_header_color: dark_scheme ? #111111 : #888888;
+    in-out property <color> list_view_clicked_header_color: dark_scheme ? #1a1a1a : #808080;
+    
     // Popup
     in-out property <color> popup_background: dark_scheme ? #353535 : #5e5e5e;
+
+
+    public pure function  get_listview_color(selected: bool, hovered: bool) -> color {
+        if (selected) {
+            return hovered ? self.list_view_item_selected_hovered_color : self.list_view_item_selected_color;
+        } else {
+            return hovered ? self.list_view_item_hovered_color : self.list_view_item_color;
+        }
+    }
+    public pure function get_listview_color_with_header(selected: bool, hovered: bool, header: bool) -> color {
+        if (header) {
+            return selected ? self.list_view_clicked_header_color : self.list_view_header_color;
+        } else {
+            return self.get_listview_color(selected, hovered);
+        }
+    }
 }
diff --git a/krokiet/ui/gui_state.slint b/krokiet/ui/gui_state.slint
index 59dc4a469..9c9952fb7 100644
--- a/krokiet/ui/gui_state.slint
+++ b/krokiet/ui/gui_state.slint
@@ -18,7 +18,7 @@ export global GuiState {
     in-out property <bool> visible_tool_settings;
 
     in-out property <bool> available_subsettings: active_tab == CurrentTab.SimilarImages || active_tab == CurrentTab.DuplicateFiles || active_tab == CurrentTab.SimilarVideos || active_tab == CurrentTab.SimilarMusic || active_tab == CurrentTab.BigFiles || active_tab == CurrentTab.BrokenFiles;
-    in-out property <CurrentTab> active_tab: CurrentTab.DuplicateFiles;
+    in-out property <CurrentTab> active_tab: CurrentTab.SimilarImages;
     in-out property <bool> is_tool_tab_active: active_tab != CurrentTab.Settings && active_tab != CurrentTab.About;
     in-out property <[SelectModel]> select_results_list: [{data: SelectMode.SelectAll, name: "Select All"}, {data: SelectMode.UnselectAll, name: "Deselect All"}, {data: SelectMode.SelectTheSmallestResolution, name: "Select the smallest resolution"}];
 
diff --git a/krokiet/ui/included_directories.slint b/krokiet/ui/included_directories.slint
index 5ee28819c..e55ba227e 100644
--- a/krokiet/ui/included_directories.slint
+++ b/krokiet/ui/included_directories.slint
@@ -31,7 +31,7 @@ export component IncludedDirectories {
                 border_radius: 5px;
                 width: parent.width;
 
-                background: touch-area.has-hover ? (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color) : (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color);
+                background: ColorPalette.get_listview_color(r.selected_row, touch-area.has-hover);
                 touch_area := TouchArea {
                     clicked => {
                         if (current_index == -1) {
@@ -90,7 +90,7 @@ export component ExcludedDirectories {
                 border_radius: 5px;
                 width: parent.width;
 
-                background: touch-area.has-hover ? (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color) : (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color);
+                background: ColorPalette.get_listview_color(r.selected_row, touch-area.has-hover);
 
                 touch_area := TouchArea {
                     clicked => {
diff --git a/krokiet/ui/left_side_panel.slint b/krokiet/ui/left_side_panel.slint
index 2587758e0..778feab5c 100644
--- a/krokiet/ui/left_side_panel.slint
+++ b/krokiet/ui/left_side_panel.slint
@@ -13,13 +13,13 @@ component TabItem {
     Rectangle {
         width: parent.width;
         horizontal-stretch: 1.0;
-        background: touch-area.has-hover ? ColorPalette.tab-hovered-color : transparent;
+        background: touch-area.has-hover ? ColorPalette.tab_hovered_color : transparent;
         touch_area := TouchArea {
             clicked => {
-                if (GuiState.active_tab == root.curr-tab) {
+                if (GuiState.active_tab == root.curr_tab) {
                     return;
                 }
-                GuiState.active_tab = root.curr-tab;
+                GuiState.active_tab = root.curr_tab;
                 Callabler.tab_changed();
                 changed_current_tab();
             }
@@ -28,12 +28,12 @@ component TabItem {
 
     HorizontalLayout {
         width: parent.width;
-        alignment: LayoutAlignment.end;
+        alignment: LayoutAlignment.start;
         layout_rectangle := VerticalLayout {
             empty_rectangle := Rectangle { }
 
             current_rectangle := Rectangle {
-                visible: (GuiState.active_tab == root.curr-tab);
+                visible: (GuiState.active_tab == root.curr_tab);
                 border-radius: 2px;
                 width: 5px;
                 height: 0px;
@@ -54,10 +54,10 @@ component TabItem {
     }
 
     states [
-        is-selected when GuiState.active_tab == root.curr-tab: {
+        is-selected when GuiState.active_tab == root.curr_tab: {
             current_rectangle.height: layout_rectangle.height;
         }
-        is-not-selected when GuiState.active_tab != root.curr-tab: {
+        is-not-selected when GuiState.active_tab != root.curr_tab: {
             current_rectangle.height: 0px;
         }
     ]
@@ -74,7 +74,7 @@ export component LeftSidePanel {
             height: 80px;
             Image {
                 width: parent.height;
-                source: @image-url("../icons/logo.png");
+                source: @image-url("../icons/logo_small.png");
                 image-fit: ImageFit.contain;
             }
             touch_area := TouchArea {
@@ -88,7 +88,7 @@ export component LeftSidePanel {
         }
 
         ListView {
-            out property <length> element-size: 25px;
+            out property <length> element_size: 25px;
             out property <[{name: string, tab: CurrentTab}]> speed_model: [
                 {name: "Duplicate Files", tab: CurrentTab.DuplicateFiles},
                 {name: "Empty Folders", tab: CurrentTab.EmptyFolders}, 
@@ -104,7 +104,7 @@ export component LeftSidePanel {
             ];
 
             for r[idx] in  speed_model: TabItem {
-                height: parent.element-size;
+                height: parent.element_size;
                 scanning: scanning;
                 text: r.name;
                 curr_tab: r.tab;
@@ -132,6 +132,8 @@ export component LeftSidePanel {
             HorizontalLayout {
                 alignment: end;
                 Button {
+                    checkable: true;
+                    checked: GuiState.visible_tool_settings;
                     visible: GuiState.available_subsettings;
                     min-width: 20px;
                     min-height: 20px;
@@ -139,7 +141,7 @@ export component LeftSidePanel {
                     preferred-height: self.width;
                     icon: @image-url("../icons/subsettings.svg");
                     clicked => {
-                        GuiState.visible_tool_settings = !GuiState.visible-tool-settings;
+                        GuiState.visible_tool_settings = !GuiState.visible_tool_settings;
                     }
                 }
             }
diff --git a/krokiet/ui/main_lists.slint b/krokiet/ui/main_lists.slint
index cce13fdc6..ed433509d 100644
--- a/krokiet/ui/main_lists.slint
+++ b/krokiet/ui/main_lists.slint
@@ -45,7 +45,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Size", "File Name", "Path", "Modification Date"];
-        column-sizes: [35px, size_px, name_px, path_px, mod_px];
+        column_sizes: [35px, size_px, name_px, path_px, mod_px];
         values <=> duplicate_files_model;
         parentPathIdx: 3;
         fileNameIdx: 2;
@@ -56,8 +56,8 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Folder Name", "Path", "Modification Date"];
-        column-sizes: [35px, name_px, path_px, mod_px];
-        values <=> empty-folder-model;
+        column_sizes: [35px, name_px, path_px, mod_px];
+        values <=> empty_folder_model;
         parentPathIdx: 2;
         fileNameIdx: 1;
     }
@@ -67,7 +67,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Size", "File Name", "Path", "Modification Date"];
-        column-sizes: [35px, size_px, name_px, path_px, mod_px];
+        column_sizes: [35px, size_px, name_px, path_px, mod_px];
         values <=> big_files_model;
         parentPathIdx: 3;
         fileNameIdx: 2;
@@ -78,8 +78,8 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "File Name", "Path", "Modification Date"];
-        column-sizes: [35px, name_px, path_px, mod_px];
-        values <=> empty-files-model;
+        column_sizes: [35px, name_px, path_px, mod_px];
+        values <=> empty_files_model;
         parentPathIdx: 2;
         fileNameIdx: 1;
     }
@@ -89,7 +89,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "File Name", "Path", "Modification Date"];
-        column-sizes: [35px, name_px, path_px, mod_px];
+        column_sizes: [35px, name_px, path_px, mod_px];
         values <=> temporary_files_model;
         parentPathIdx: 2;
         fileNameIdx: 1;
@@ -100,8 +100,8 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Similarity", "Size", "Dimensions", "File Name", "Path", "Modification Date"];
-        column-sizes: [35px, 80px, 80px, 80px, name_px, path_px, mod_px];
-        values <=> similar-images-model;
+        column_sizes: [35px, 80px, 80px, 80px, name_px, path_px, mod_px];
+        values <=> similar_images_model;
         parentPathIdx: 5;
         fileNameIdx: 4;
     }
@@ -111,7 +111,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Size", "File Name", "Path", "Modification Date"];
-        column-sizes: [35px, size_px, name_px, path_px, mod_px];
+        column_sizes: [35px, size_px, name_px, path_px, mod_px];
         values <=> similar_videos_model;
         parentPathIdx: 3;
         fileNameIdx: 2;
@@ -122,7 +122,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Size", "File Name", "Title","Artist", "Year", "Bitrate", "Length", "Genre", "Path", "Modification Date"];
-        column-sizes: [35px, size_px, name_px, 80px, 80px, 80px, 80px, 80px, 80px, path_px, mod_px];
+        column_sizes: [35px, size_px, name_px, 80px, 80px, 80px, 80px, 80px, 80px, path_px, mod_px];
         values <=> similar_music_model;
         parentPathIdx: 9;
         fileNameIdx: 2;
@@ -133,7 +133,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "Symlink Name", "Symlink Folder", "Destination Path", "Modification Date"];
-        column-sizes: [35px, name_px, path_px, path_px, mod_px];
+        column_sizes: [35px, name_px, path_px, path_px, mod_px];
         values <=> invalid_symlinks_model;
         parentPathIdx: 2;
         fileNameIdx: 1;
@@ -144,7 +144,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "File Name", "Path", "Type of Error", "Size", "Modification Date"];
-        column-sizes: [35px, name_px, path_px, 200px, size_px, mod_px];
+        column_sizes: [35px, name_px, path_px, 200px, size_px, mod_px];
         values <=> broken_files_model;
         parentPathIdx: 2;
         fileNameIdx: 1;
@@ -155,7 +155,7 @@ export component MainList {
         min-width: 200px;
         height: parent.height;
         columns: ["Selection", "File Name", "Path", "Current Extension", "Proper Extension"];
-        column-sizes: [35px, name_px, path_px, 40px, 200px];
+        column_sizes: [35px, name_px, path_px, 40px, 200px];
         values <=> bad_extensions_model;
         parentPathIdx: 2;
         fileNameIdx: 1;
@@ -170,7 +170,8 @@ export component MainList {
     }
 
     focus_item := FocusScope {
-        width: 0px; // Hack to not steal first click from other components - https://github.com/slint-ui/slint/issues/3503
+        // TODO consider to remove that - looks that hack not works and is unnecessary
+        // width: 0px; // Hack to not steal first click from other components - https://github.com/slint-ui/slint/issues/3503
         // Hack not works https://github.com/slint-ui/slint/issues/3503#issuecomment-1817809834 because disables key-released event
 
         key-released(event) => {
@@ -180,12 +181,34 @@ export component MainList {
             if (GuiState.active_tab == CurrentTab.EmptyFiles) {
                 empty_files.released_key(event);
             } else if (GuiState.active_tab == CurrentTab.EmptyFolders) {
-                empty-folders.released_key(event);
+                empty_folders.released_key(event);
             } else if (GuiState.active_tab == CurrentTab.SimilarImages) {
-                similar-images.released_key(event);
+                similar_images.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.BadExtensions) {
+                bad_extensions.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.BigFiles) {
+                big_files.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.DuplicateFiles) {
+                duplicates.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.TemporaryFiles) {
+                temporary_files.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.SimilarVideos) {
+                similar_videos.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.SimilarMusic) {
+                similar_music.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.InvalidSymlinks) {
+                invalid_symlink.released_key(event);
+            } else if (GuiState.active_tab == CurrentTab.BrokenFiles) {
+                broken_files.released_key(event);
             } else {
-                debug("Non handled key in main_lists.slint");
+                debug("Non handled key in main_lists.slint", event, GuiState.active_tab);
             }
+            
+            
+            
+            // else {
+            //     debug("Non handled key in main_lists.slint", event, GuiState.active_tab);
+            // }
             accept
         }
     }
diff --git a/krokiet/ui/main_window.slint b/krokiet/ui/main_window.slint
index d0f28fb6a..55fabdfd2 100644
--- a/krokiet/ui/main_window.slint
+++ b/krokiet/ui/main_window.slint
@@ -47,7 +47,7 @@ export component MainWindow inherits Window {
     in-out property <[MainListModel]> empty_folder_model: [];
     in-out property <[MainListModel]> big_files_model: [];
     in-out property <[MainListModel]> empty_files_model: [];
-    in-out property <[MainListModel]> temporary-files_model: [];
+    in-out property <[MainListModel]> temporary_files_model: [];
     in-out property <[MainListModel]> similar_images_model: [];
     in-out property <[MainListModel]> similar_videos_model: [];
     in-out property <[MainListModel]> similar_music_model: [];
@@ -82,7 +82,7 @@ export component MainWindow inherits Window {
                         empty_folder_model <=> root.empty_folder_model;
                         big_files_model <=> root.big_files_model;
                         empty_files_model <=> root.empty_files_model;
-                        temporary-files_model <=> root.temporary-files_model;
+                        temporary_files_model <=> root.temporary_files_model;
                         similar_images_model <=> root.similar_images_model;
                         similar_videos_model <=> root.similar_videos_model;
                         similar_music_model <=> root.similar_music_model;
@@ -118,9 +118,21 @@ export component MainWindow inherits Window {
         }
 
         action_buttons := ActionButtons {
+            duplicate_files_model <=> root.duplicate_files_model;
+            empty_folder_model <=> root.empty_folder_model;
+            big_files_model <=> root.big_files_model;
+            empty_files_model <=> root.empty_files_model;
+            temporary_files_model <=> root.temporary_files_model;
+            similar_images_model <=> root.similar_images_model;
+            similar_videos_model <=> root.similar_videos_model;
+            similar_music_model <=> root.similar_music_model;
+            invalid_symlinks_model <=> root.invalid_symlinks_model;
+            broken_files_model <=> root.broken_files_model;
+            bad_extensions_model <=> root.bad_extensions_model;
+
             vertical-stretch: 0.0;
             scanning <=> root.scanning;
-            stop_requested <=> root.stop-requested;
+            stop_requested <=> root.stop_requested;
             scan_stopping => {
                 text_summary_text = "Stopping scan, please wait...";
                 root.scan_stopping();
@@ -156,7 +168,7 @@ export component MainWindow inherits Window {
         }
 
         bottom_panel := BottomPanel {
-            bottom-panel-visibility <=> action_buttons.bottom_panel_visibility;
+            bottom_panel_visibility <=> action_buttons.bottom_panel_visibility;
             vertical-stretch: 0.0;
             folder_choose_requested(included_directories) => {
                 root.folder_choose_requested(included_directories)
diff --git a/krokiet/ui/popup_new_directories.slint b/krokiet/ui/popup_new_directories.slint
index 1de76e5f4..95a094897 100644
--- a/krokiet/ui/popup_new_directories.slint
+++ b/krokiet/ui/popup_new_directories.slint
@@ -44,17 +44,16 @@ export component PopupNewDirectories inherits Rectangle {
 
                         TextEdit {
                             vertical-stretch: 1.0;
-                            text <=> text-data;
+                            text <=> text_data;
                         }
 
                         HorizontalLayout {
                             min-height: 20px;
                             Button {
-                                enabled: text-data != "";
+                                enabled: text_data != "";
                                 text: "OK";
                                 clicked => {
                                     Callabler.added_manual_directories(GuiState.choosing_include_directories, text_data);
-                                    debug("OK");
                                     popup_window.close();
                                 }
                             }
@@ -62,7 +61,6 @@ export component PopupNewDirectories inherits Rectangle {
                             Button {
                                 text: "Cancel";
                                 clicked => {
-                                    debug("Cancel");
                                     popup_window.close();
                                 }
                             }
diff --git a/krokiet/ui/progress.slint b/krokiet/ui/progress.slint
index 2c874f574..5f632e333 100644
--- a/krokiet/ui/progress.slint
+++ b/krokiet/ui/progress.slint
@@ -11,7 +11,7 @@ export component Progress {
     preferred-height: 40px;
     VerticalLayout {
         Text {
-            text: progress-datas.step-name;
+            text: progress-datas.step_name;
             horizontal-alignment: TextHorizontalAlignment.center;
         }
 
@@ -35,9 +35,9 @@ export component Progress {
                 VerticalLayout {
                     alignment: LayoutAlignment.center;
                     ProgressIndicator {
-                        visible: progress_datas.current-progress >= -0.001;
+                        visible: progress_datas.current_progress >= -0.001;
                         height: 8px;
-                        progress: progress_datas.current-progress / 100.0;
+                        progress: progress_datas.current_progress / 100.0;
                     }
                 }
 
@@ -45,7 +45,7 @@ export component Progress {
                     alignment: LayoutAlignment.center;
                     ProgressIndicator {
                         height: 8px;
-                        progress: progress_datas.all-progress / 100.0;
+                        progress: progress_datas.all_progress / 100.0;
                     }
                 }
             }
@@ -53,14 +53,14 @@ export component Progress {
             VerticalLayout {
                 spacing: 5px;
                 Text {
-                    visible: progress_datas.current-progress >= -0.001;
+                    visible: progress_datas.current_progress >= -0.001;
                     vertical-alignment: TextVerticalAlignment.center;
-                    text: progress_datas.current-progress + "%";
+                    text: progress_datas.current_progress + "%";
                 }
 
                 Text {
                     vertical-alignment: TextVerticalAlignment.center;
-                    text: progress_datas.all-progress + "%";
+                    text: progress_datas.all_progress + "%";
                 }
             }
         }
diff --git a/krokiet/ui/selectable_tree_view.slint b/krokiet/ui/selectable_tree_view.slint
index b72edbd1d..e96327040 100644
--- a/krokiet/ui/selectable_tree_view.slint
+++ b/krokiet/ui/selectable_tree_view.slint
@@ -15,7 +15,7 @@ export component SelectableTableView inherits Rectangle {
         {checked: true, selected_row: false, header_row: false, filled_header_row: false, val_str: ["lokkaler", "/Xd1/Vide2", "01.23.1911"], val_int: []}
     ];
     in-out property <[length]> column_sizes: [30px, 80px, 150px, 160px];
-    private property <int> column_number: column-sizes.length + 1;
+    private property <int> column_number: column_sizes.length + 1;
     // This idx, starts from zero, but since first is always a checkbox, and is not in model.val values, remove 1 from idx
     in-out property <int> parentPathIdx;
     in-out property <int> fileNameIdx;
@@ -32,7 +32,7 @@ export component SelectableTableView inherits Rectangle {
             HorizontalLayout {
                 spacing: 5px;
                 for title [idx] in root.columns: HorizontalLayout {
-                    width: root.column-sizes[idx];
+                    width: root.column_sizes[idx];
                     Text {
                         overflow: elide;
                         text: title;
@@ -73,33 +73,35 @@ export component SelectableTableView inherits Rectangle {
             
                 border-radius: 5px;
                 height: 20px;
-                background: r.header-row ? ColorPalette.list_view_normal_header_color : (touch-area.has-hover ? (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color) : (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color));
+                background: ColorPalette.get_listview_color_with_header(r.selected_row, touch-area.has-hover, r.header_row);
                 touch_area := TouchArea {
                     function clicked_manual() {
-                        if (!r.header_row) {
-                            if (root.selected-item == -1) {
+                        // We don't allow to select header row
+                        // unless it contains data, which is true only for for modes with reference folders
+                        if (!r.header_row || r.val_str.length > 0) {
+                            if (root.selected_item == -1) {
                                 r.selected_row = !r.selected_row;
-                                root.selected-item = idx;
+                                root.selected_item = idx;
                             } else {
-                                if (!r.selected_row && root.selected-item != idx) {
+                                if (!r.selected_row && root.selected_item != idx) {
                                     r.selected_row = !r.selected_row;
-                                    root.values[root.selected-item].selected_row = false;
-                                    root.selected-item = idx;
+                                    root.values[root.selected_item].selected_row = false;
+                                    root.selected_item = idx;
                                 }
                             }
 
                             if (root.selected_item != -1) {
-                                Callabler.load_image_preview(r.val_str[root.parentPathIdx - 1] + "/" + r.val_str[root.fileNameIdx - 1]);
+                                showPreview();
                             } else {
                                 GuiState.preview_visible = false;
                             }
                         }
                     }
                     double-clicked => {
-                            if (r.header_row && !r.filled_header_row) {
-                                return;
-                            }
-                            Callabler.item_opened(r.val_str[root.parentPathIdx - 1] + "/" + r.val_str[root.fileNameIdx - 1])
+                        if (r.header_row && !r.filled_header_row) {
+                            return;
+                        }
+                        openSelectedItem();
                     }
                     pointer-event(event) => {
                         // TODO this should be clicked by double-click - https://github.com/slint-ui/slint/issues/4235
@@ -119,9 +121,9 @@ export component SelectableTableView inherits Rectangle {
 
                 HorizontalLayout {
                     CheckBox {
-                        visible: !r.header-row;
-                        checked: r.checked && !r.header-row;
-                        width: root.column-sizes[0];
+                        visible: !r.header_row;
+                        checked: r.checked && !r.header_row;
+                        width: root.column_sizes[0];
                         toggled => {
                             r.checked = self.checked;
                         }
@@ -130,7 +132,7 @@ export component SelectableTableView inherits Rectangle {
                     HorizontalLayout {
                         spacing: 5px;
                         for f [idx] in r.val_str: Text {
-                            width: root.column-sizes[idx + 1];
+                            width: root.column_sizes[idx + 1];
                             text: f;
                             font-size: 12px;
                             vertical-alignment: center;
@@ -144,17 +146,29 @@ export component SelectableTableView inherits Rectangle {
 
     public function deselect_selected_item() {
         if (root.selected_item != -1) {
-            root.values[root.selected-item].selected_row = false;
-            root.selected-item = -1;
+            root.values[root.selected_item].selected_row = false;
+            root.selected_item = -1;
         }
     }
 
+    function showPreview() {
+        Callabler.load_image_preview(root.values[root.selected_item].val_str[root.parentPathIdx - 1] + "/" + root.values[root.selected_item].val_str[root.fileNameIdx - 1]);
+    }
+
+    function openSelectedItem() {
+        Callabler.item_opened(root.values[root.selected_item].val_str[root.parentPathIdx - 1] + "/" + root.values[root.selected_item].val_str[root.fileNameIdx - 1]);
+    }
+
     // TODO this should work with multiple selection and shift and control key - problably logic will need to be set in global state
     public function released_key(event: KeyEvent) {
         if (event.text == " ") {
-            if (root.selected_item != -1) {
+            if (root.selected_item != -1 && !root.values[root.selected_item].header_row) {
                 root.values[root.selected_item].checked = !root.values[root.selected_item].checked;
             }
+        } else if (event.text == "\n" ) {
+            if (root.selected_item != -1) {
+                openSelectedItem();
+            }
         } else if (event.text == Key.DownArrow) {
             if (root.selected_item != -1) {
                 if (root.values.length - 1 == root.selected_item) {
@@ -171,6 +185,7 @@ export component SelectableTableView inherits Rectangle {
                         root.selected_item += 1;
                     }
                     root.values[root.selected_item].selected_row = true;
+                    showPreview();
                 }
             } else {
                 // Select last item if nothing is selected
@@ -181,6 +196,7 @@ export component SelectableTableView inherits Rectangle {
                         root.selected_item = 0;
                     }
                     root.values[root.selected_item].selected_row = true;
+                    showPreview();
                 }
             }
         } else if (event.text == Key.UpArrow) {
@@ -202,6 +218,7 @@ export component SelectableTableView inherits Rectangle {
                     }
                     if (root.selected_item != -1) {
                         root.values[root.selected_item].selected_row = true;
+                        showPreview();
                     }
                 }
             } else {
@@ -209,6 +226,7 @@ export component SelectableTableView inherits Rectangle {
                 if (root.values.length > 0) {
                     root.selected_item = root.values.length - 1;
                     root.values[root.selected_item].selected_row = true;
+                    showPreview();
                 }
             }
         }
diff --git a/krokiet/ui/settings_list.slint b/krokiet/ui/settings_list.slint
index e0c44e5d8..cfb48a4ce 100644
--- a/krokiet/ui/settings_list.slint
+++ b/krokiet/ui/settings_list.slint
@@ -213,11 +213,11 @@ export component SettingsList inherits VerticalLayout {
 
             }
             CheckBoxComponent {
-                name: "Recursive";
+                name: "Recursive search";
                 model <=> Settings.recursive_search;
             }
             CheckBoxComponent {
-                name: "Use Cache";
+                name: "Use cache";
                 model <=> Settings.use_cache;
             }
             CheckBoxComponent {


Test patch: