Added support for different buttons events for different notebook tabs

This commit is contained in:
Rafał Mikrut 2020-09-09 21:32:23 +02:00
parent feee8c6a83
commit b19612cfdf
5 changed files with 196 additions and 111 deletions

View File

@ -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 |

View File

@ -101,7 +101,7 @@ impl DuplicateFinder {
let extensions: Vec<String> = 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
};

View File

@ -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
};

View File

@ -245,13 +245,13 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkNotebook">
<object class="GtkNotebook" id="notebook_chooser_tool">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tab_pos">left</property>
<property name="scrollable">True</property>
<child>
<object class="GtkBox">
<object class="GtkBox" id="notebook_duplicate_finder_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
@ -301,7 +301,7 @@ Author: Rafał Mikrut
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
@ -309,7 +309,7 @@ Author: Rafał Mikrut
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="notebook_duplicate_finder_label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Duplicates files</property>
@ -319,7 +319,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<object class="GtkScrolledWindow" id="notebook_empty_folders_label">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
@ -738,34 +738,10 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkBox">
<object class="GtkEntry" id="info_entry">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkListBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<property name="can_focus">True</property>
<property name="editable">False</property>
</object>
<packing>
<property name="expand">False</property>

View File

@ -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<String> = 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 : &gtk::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();
}
// 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: &gtk::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");
// }