diff --git a/README.md b/README.md index 4e871aa..457f83a 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ This is my first ever project in Rust so probably a lot of things are written in - Support for showing only duplicates with specific extension, name(Regex support needed) - Maybe windows support, but this will need some refactoring in code - Translation support +- Add support for fast searching based on checking only first ~1MB of file. ## Usage and requirements Rustc 1.46 works fine(not sure about a minimal version) @@ -83,17 +84,24 @@ I checked my home directory without any folder exceptions(I removed all director First run reads file entry and save it to cache so this step is mostly limited by disk performance, and with second run cache helps it so searching is a lot of faster. -Duplicate Checker +Duplicate Checker(Version 0.1) | App| Executing Time | |:----------:|:-------------:| | Fslint (First Run)| 140s | | Fslint (Second Run)| 23s | -| Czkawka CLI Debug(First Run) | 136s | -| Czkawka CLI Debug(Second Run) | 14s | | Czkawka CLI Release(First Run) | 128s | | Czkawka CLI Release(Second Run) | 8s | +| App| Idle Ram | Max Operational Ram Usage | +|:----------:|:-------------:|:-------------:| +| Fslint | | | +| Czkawka CLI Debug | | +| Czkawka CLI Release | | +| Czkawka GUI Debug | | +| Czkawka GUI Release | | + + Empty folder finder | App| Executing Time | diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index a958ec7..3532a68 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -101,7 +101,7 @@ impl DuplicateFinder { let extensions: Vec = allowed_extensions.split(',').map(String::from).collect(); for mut extension in extensions { - if extension == ""{ + if extension == "" { continue; } @@ -285,7 +285,7 @@ impl DuplicateFinder { _ => continue, }; for entry in read_dir { - let entry_data = match entry{ + let entry_data = match entry { Ok(t) => t, Err(_) => continue, //Permissions denied }; diff --git a/czkawka_core/src/empty_folder.rs b/czkawka_core/src/empty_folder.rs index 5579b75..87dc33b 100644 --- a/czkawka_core/src/empty_folder.rs +++ b/czkawka_core/src/empty_folder.rs @@ -122,11 +122,11 @@ impl EmptyFolder { }; for entry in read_dir { - let entry_data = match entry{ + let entry_data = match entry { Ok(t) => t, Err(_) => continue, //Permissions denied - }; - let metadata: Metadata = match entry_data.metadata(){ + }; + let metadata: Metadata = match entry_data.metadata() { Ok(t) => t, Err(_) => continue, //Permissions denied }; diff --git a/czkawka_gui/czkawka.glade b/czkawka_gui/czkawka.glade index 28f6caa..94908e5 100644 --- a/czkawka_gui/czkawka.glade +++ b/czkawka_gui/czkawka.glade @@ -245,13 +245,13 @@ Author: Rafał Mikrut - + True True left True - + True False vertical @@ -301,7 +301,7 @@ Author: Rafał Mikrut - False + True True 1 @@ -309,7 +309,7 @@ Author: Rafał Mikrut - + True False Duplicates files @@ -319,7 +319,7 @@ Author: Rafał Mikrut - + True True in @@ -738,34 +738,10 @@ Author: Rafał Mikrut - + True - False - - - True - False - - - False - True - 0 - - - - - True - True - - - - - - False - True - 1 - - + True + False False diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index a75bba5..dddce23 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -2,93 +2,194 @@ use czkawka_core::{duplicate, empty_folder}; extern crate gtk; +use czkawka_core::duplicate::{CheckingMethod, DeleteMethod}; +use duplicate::DuplicateFinder; use gtk::prelude::*; use gtk::{Builder, TreeView, TreeViewColumn}; -use duplicate::DuplicateFinder; -use czkawka_core::duplicate::{CheckingMethod, DeleteMethod}; +// use glib::gobject_sys::g_signal_emit; // use gtk::{ButtonsType, DialogFlags, MessageDialog, MessageType, Window}; fn main() { gtk::init().expect("Failed to initialize GTK."); + // Loads from glade file all elements + // Loading glade file content let glade_src = include_str!("../czkawka.glade"); // Build UI from glade file - let builder = gtk::Builder::from_string(glade_src); + let builder = Builder::from_string(glade_src); - // Show first window + // Windows let main_window: gtk::Window = builder.get_object("main_window").unwrap(); main_window.show_all(); - prepare_buttons_at_start(builder); + // Notepad Buttons + // Buttons + let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap(); + let buttons_stop: gtk::Button = builder.get_object("buttons_stop").unwrap(); + let buttons_resume: gtk::Button = builder.get_object("buttons_resume").unwrap(); + let buttons_pause: gtk::Button = builder.get_object("buttons_pause").unwrap(); + let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap(); + let buttons_delete: gtk::Button = builder.get_object("buttons_delete").unwrap(); + let buttons_save: gtk::Button = builder.get_object("buttons_save").unwrap(); + + // Notebooks + let notebook_chooser_tool: gtk::Notebook = builder.get_object("notebook_chooser_tool").unwrap(); + // let children_of_notebook_chooser_tool = notebook_chooser_tool.get_children(); + let mut notebook_chooser_tool_children_names: Vec = Vec::new(); + + for i in notebook_chooser_tool.get_children() { + notebook_chooser_tool_children_names.push(i.get_buildable_name().unwrap().to_string()); + } + + println!("{}", notebook_chooser_tool.get_current_page().unwrap()); + println!("{:?}", notebook_chooser_tool_children_names); + // Entry + let info_entry: gtk::Entry = builder.get_object("info_entry").unwrap(); // To show default + + // Scrolled window + let scrolled_window_duplicate_finder: gtk::ScrolledWindow = builder.get_object("scrolled_window_duplicate_finder").unwrap(); + + { + // Set starting intro + // Duplicate Finder + + let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); + name_column.set_title("File Name"); + name_column.set_resizable(true); + name_column.set_min_width(50); + + let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); + path_column.set_title("Path"); + path_column.set_resizable(true); + path_column.set_min_width(100); + + let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); + modification_date_column.set_title("Modification Date"); + modification_date_column.set_resizable(true); + modification_date_column.set_min_width(100); + + let col_types: [glib::types::Type; 3] = [glib::types::Type::String, glib::types::Type::String, glib::types::Type::String]; + let list_store: gtk::ListStore = gtk::ListStore::new(&col_types); + + let tree_view_duplicate_finder: gtk::TreeView = TreeView::with_model(&list_store); + + tree_view_duplicate_finder.append_column(&name_column); + tree_view_duplicate_finder.append_column(&path_column); + tree_view_duplicate_finder.append_column(&modification_date_column); + + scrolled_window_duplicate_finder.add(&tree_view_duplicate_finder); + scrolled_window_duplicate_finder.show_all(); + + info_entry.set_text("Duplicated Files"); + + // // Disable all unused buttons + buttons_search.show(); + buttons_stop.hide(); + buttons_resume.hide(); + buttons_pause.hide(); + buttons_select.show(); + buttons_delete.hide(); + buttons_save.hide(); + } + { + // Connect Buttons + + // let buttons_search = buttons_search.clone(); + // let info_entry = info_entry.clone(); + + buttons_search.connect_clicked(move |_| { + assert!(notebook_chooser_tool_children_names.contains(&"notebook_duplicate_finder_label".to_string())); + assert!(notebook_chooser_tool_children_names.contains(&"notebook_empty_folders_label".to_string())); + match notebook_chooser_tool_children_names.get(notebook_chooser_tool.get_current_page().unwrap() as usize).unwrap().as_str() { + "notebook_duplicate_finder_label" => { + let mut df = DuplicateFinder::new(); + df.set_include_directory("/home/rafal/Pulpit".to_owned()); + df.set_exclude_directory("/rafa/".to_owned()); + df.set_allowed_extensions("".to_owned()); + df.set_min_file_size(1000); // TODO Change to proper value + df.find_duplicates(&CheckingMethod::HASH, &DeleteMethod::None); + info_entry.set_text("Found TODO duplicates files in TODO groups which took TODO GB/MB/KB/B"); + } + "notebook_empty_folders_label" => { + + } + e => panic!("Not existent {}", e), + } + }); + } + + // Quit the program when X in main window was clicked + main_window.connect_delete_event(|_, _| { + gtk::main_quit(); + Inhibit(false) + }); // We start the gtk main loop. gtk::main(); } -fn prepare_buttons_at_start(builder : Builder){ - let buttons_search : gtk::Button = builder.get_object("buttons_search").unwrap(); - buttons_search.connect_clicked(search_for_duplicates); - let buttons_stop : gtk::Button = builder.get_object("buttons_stop").unwrap(); - buttons_stop.hide(); - let buttons_resume : gtk::Button = builder.get_object("buttons_resume").unwrap(); - buttons_resume.hide(); - let buttons_pause : gtk::Button = builder.get_object("buttons_pause").unwrap(); - buttons_pause.hide(); - - - let buttons_select : gtk::Button = builder.get_object("buttons_select").unwrap(); - buttons_select.hide(); - let buttons_delete : gtk::Button = builder.get_object("buttons_delete").unwrap(); - buttons_delete.hide(); - let buttons_save : gtk::Button = builder.get_object("buttons_save").unwrap(); - buttons_save.hide(); - - search_for_duplicates_layout(builder); -} -fn search_for_duplicates_layout(builder:Builder){ - - let scrolled_window_duplicate_finder : gtk::ScrolledWindow = builder.get_object("scrolled_window_duplicate_finder").unwrap(); - - - let name_column : gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.set_title("File Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - - let path_column : gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(50); - - let modification_date_column : gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(50); - - let col_types: [glib::types::Type; 2] = [ - glib::types::Type::String, - glib::types::Type::String, - ]; - let list_store : gtk::ListStore = gtk::ListStore::new(&col_types); - - let tree_view_duplicate_finder : gtk::TreeView = TreeView::with_model(&list_store); - - tree_view_duplicate_finder.append_column(&name_column); - tree_view_duplicate_finder.append_column(&path_column); - tree_view_duplicate_finder.append_column(&modification_date_column); - - scrolled_window_duplicate_finder.add(&tree_view_duplicate_finder); - scrolled_window_duplicate_finder.show_all(); -} -fn search_for_duplicates(button : >k::Button){// : gtk::Button){ - println!("Szukam"); - button.hide(); - let mut df = DuplicateFinder::new(); - df.set_include_directory("/home/rafal/Pulpit".to_owned()); - df.set_exclude_directory("/rafa/".to_owned()); - df.set_allowed_extensions("".to_owned()); - df.set_min_file_size(1000); - df.find_duplicates(&CheckingMethod::HASH, &DeleteMethod::None); - button.show(); -} \ No newline at end of file +// fn prepare_buttons_at_start(builder: Builder) { +// let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap(); +// buttons_search.connect_clicked(search_for_duplicates); +// let buttons_stop: gtk::Button = builder.get_object("buttons_stop").unwrap(); +// buttons_stop.hide(); +// let buttons_resume: gtk::Button = builder.get_object("buttons_resume").unwrap(); +// buttons_resume.hide(); +// let buttons_pause: gtk::Button = builder.get_object("buttons_pause").unwrap(); +// buttons_pause.hide(); +// +// let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap(); +// buttons_select.hide(); +// let buttons_delete: gtk::Button = builder.get_object("buttons_delete").unwrap(); +// buttons_delete.hide(); +// let buttons_save: gtk::Button = builder.get_object("buttons_save").unwrap(); +// buttons_save.hide(); +// +// search_for_duplicates_layout(builder); +// } +// fn search_for_duplicates_layout(builder: Builder) { +// let scrolled_window_duplicate_finder: gtk::ScrolledWindow = builder.get_object("scrolled_window_duplicate_finder").unwrap(); +// +// let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); +// name_column.set_title("File Name"); +// name_column.set_resizable(true); +// name_column.set_min_width(50); +// +// let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); +// path_column.set_title("Path"); +// path_column.set_resizable(true); +// path_column.set_min_width(50); +// +// let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); +// modification_date_column.set_title("Modification Date"); +// modification_date_column.set_resizable(true); +// modification_date_column.set_min_width(50); +// +// let col_types: [glib::types::Type; 2] = [glib::types::Type::String, glib::types::Type::String]; +// let list_store: gtk::ListStore = gtk::ListStore::new(&col_types); +// +// let tree_view_duplicate_finder: gtk::TreeView = TreeView::with_model(&list_store); +// +// tree_view_duplicate_finder.append_column(&name_column); +// tree_view_duplicate_finder.append_column(&path_column); +// tree_view_duplicate_finder.append_column(&modification_date_column); +// +// scrolled_window_duplicate_finder.add(&tree_view_duplicate_finder); +// scrolled_window_duplicate_finder.show_all(); +// } +// fn search_for_duplicates(button: >k::Button) { +// // let info_entry : gtk::Entry = builder.get_object("info_entry").unwrap(); +// // info_entry.set_text("Duplicated Files"); +// +// button.hide(); +// let mut df = DuplicateFinder::new(); +// df.set_include_directory("/home/rafal/Pulpit".to_owned()); +// df.set_exclude_directory("/rafa/".to_owned()); +// df.set_allowed_extensions("".to_owned()); +// df.set_min_file_size(1000); +// df.find_duplicates(&CheckingMethod::HASH, &DeleteMethod::None); +// button.show(); +// +// // info_entry.set_text("Found TODO duplicates files in TODO groups which took TODO GB/MB/KB/B"); +// }