Added support for different buttons events for different notebook tabs
This commit is contained in:
parent
feee8c6a83
commit
b19612cfdf
14
README.md
14
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)
|
- Support for showing only duplicates with specific extension, name(Regex support needed)
|
||||||
- Maybe windows support, but this will need some refactoring in code
|
- Maybe windows support, but this will need some refactoring in code
|
||||||
- Translation support
|
- Translation support
|
||||||
|
- Add support for fast searching based on checking only first ~1MB of file.
|
||||||
|
|
||||||
## Usage and requirements
|
## Usage and requirements
|
||||||
Rustc 1.46 works fine(not sure about a minimal version)
|
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.
|
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 |
|
| App| Executing Time |
|
||||||
|:----------:|:-------------:|
|
|:----------:|:-------------:|
|
||||||
| Fslint (First Run)| 140s |
|
| Fslint (First Run)| 140s |
|
||||||
| Fslint (Second Run)| 23s |
|
| 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(First Run) | 128s |
|
||||||
| Czkawka CLI Release(Second Run) | 8s |
|
| 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
|
Empty folder finder
|
||||||
|
|
||||||
| App| Executing Time |
|
| App| Executing Time |
|
||||||
|
|
|
@ -101,7 +101,7 @@ impl DuplicateFinder {
|
||||||
|
|
||||||
let extensions: Vec<String> = allowed_extensions.split(',').map(String::from).collect();
|
let extensions: Vec<String> = allowed_extensions.split(',').map(String::from).collect();
|
||||||
for mut extension in extensions {
|
for mut extension in extensions {
|
||||||
if extension == ""{
|
if extension == "" {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ impl DuplicateFinder {
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
};
|
||||||
for entry in read_dir {
|
for entry in read_dir {
|
||||||
let entry_data = match entry{
|
let entry_data = match entry {
|
||||||
Ok(t) => t,
|
Ok(t) => t,
|
||||||
Err(_) => continue, //Permissions denied
|
Err(_) => continue, //Permissions denied
|
||||||
};
|
};
|
||||||
|
|
|
@ -122,11 +122,11 @@ impl EmptyFolder {
|
||||||
};
|
};
|
||||||
|
|
||||||
for entry in read_dir {
|
for entry in read_dir {
|
||||||
let entry_data = match entry{
|
let entry_data = match entry {
|
||||||
Ok(t) => t,
|
Ok(t) => t,
|
||||||
Err(_) => continue, //Permissions denied
|
Err(_) => continue, //Permissions denied
|
||||||
};
|
};
|
||||||
let metadata: Metadata = match entry_data.metadata(){
|
let metadata: Metadata = match entry_data.metadata() {
|
||||||
Ok(t) => t,
|
Ok(t) => t,
|
||||||
Err(_) => continue, //Permissions denied
|
Err(_) => continue, //Permissions denied
|
||||||
};
|
};
|
||||||
|
|
|
@ -245,13 +245,13 @@ Author: Rafał Mikrut
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkNotebook">
|
<object class="GtkNotebook" id="notebook_chooser_tool">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="tab_pos">left</property>
|
<property name="tab_pos">left</property>
|
||||||
<property name="scrollable">True</property>
|
<property name="scrollable">True</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox" id="notebook_duplicate_finder_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
|
@ -301,7 +301,7 @@ Author: Rafał Mikrut
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">True</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
|
@ -309,7 +309,7 @@ Author: Rafał Mikrut
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child type="tab">
|
<child type="tab">
|
||||||
<object class="GtkLabel" id="notebook_duplicate_finder_label">
|
<object class="GtkLabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">Duplicates files</property>
|
<property name="label" translatable="yes">Duplicates files</property>
|
||||||
|
@ -319,7 +319,7 @@ Author: Rafał Mikrut
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow" id="notebook_empty_folders_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="shadow_type">in</property>
|
<property name="shadow_type">in</property>
|
||||||
|
@ -738,34 +738,10 @@ Author: Rafał Mikrut
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkEntry" id="info_entry">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">True</property>
|
||||||
<child>
|
<property name="editable">False</property>
|
||||||
<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>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
|
|
@ -2,93 +2,194 @@
|
||||||
use czkawka_core::{duplicate, empty_folder};
|
use czkawka_core::{duplicate, empty_folder};
|
||||||
|
|
||||||
extern crate gtk;
|
extern crate gtk;
|
||||||
|
use czkawka_core::duplicate::{CheckingMethod, DeleteMethod};
|
||||||
|
use duplicate::DuplicateFinder;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::{Builder, TreeView, TreeViewColumn};
|
use gtk::{Builder, TreeView, TreeViewColumn};
|
||||||
use duplicate::DuplicateFinder;
|
// use glib::gobject_sys::g_signal_emit;
|
||||||
use czkawka_core::duplicate::{CheckingMethod, DeleteMethod};
|
|
||||||
// use gtk::{ButtonsType, DialogFlags, MessageDialog, MessageType, Window};
|
// use gtk::{ButtonsType, DialogFlags, MessageDialog, MessageType, Window};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
gtk::init().expect("Failed to initialize GTK.");
|
gtk::init().expect("Failed to initialize GTK.");
|
||||||
|
|
||||||
|
// Loads from glade file all elements
|
||||||
|
|
||||||
// Loading glade file content
|
// Loading glade file content
|
||||||
let glade_src = include_str!("../czkawka.glade");
|
let glade_src = include_str!("../czkawka.glade");
|
||||||
// Build UI from glade file
|
// 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();
|
let main_window: gtk::Window = builder.get_object("main_window").unwrap();
|
||||||
main_window.show_all();
|
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.
|
// We start the gtk main loop.
|
||||||
gtk::main();
|
gtk::main();
|
||||||
}
|
}
|
||||||
fn prepare_buttons_at_start(builder : Builder){
|
// fn prepare_buttons_at_start(builder: Builder) {
|
||||||
let buttons_search : gtk::Button = builder.get_object("buttons_search").unwrap();
|
// let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap();
|
||||||
buttons_search.connect_clicked(search_for_duplicates);
|
// buttons_search.connect_clicked(search_for_duplicates);
|
||||||
let buttons_stop : gtk::Button = builder.get_object("buttons_stop").unwrap();
|
// let buttons_stop: gtk::Button = builder.get_object("buttons_stop").unwrap();
|
||||||
buttons_stop.hide();
|
// buttons_stop.hide();
|
||||||
let buttons_resume : gtk::Button = builder.get_object("buttons_resume").unwrap();
|
// let buttons_resume: gtk::Button = builder.get_object("buttons_resume").unwrap();
|
||||||
buttons_resume.hide();
|
// buttons_resume.hide();
|
||||||
let buttons_pause : gtk::Button = builder.get_object("buttons_pause").unwrap();
|
// let buttons_pause: gtk::Button = builder.get_object("buttons_pause").unwrap();
|
||||||
buttons_pause.hide();
|
// buttons_pause.hide();
|
||||||
|
//
|
||||||
|
// let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap();
|
||||||
let buttons_select : gtk::Button = builder.get_object("buttons_select").unwrap();
|
// buttons_select.hide();
|
||||||
buttons_select.hide();
|
// let buttons_delete: gtk::Button = builder.get_object("buttons_delete").unwrap();
|
||||||
let buttons_delete : gtk::Button = builder.get_object("buttons_delete").unwrap();
|
// buttons_delete.hide();
|
||||||
buttons_delete.hide();
|
// let buttons_save: gtk::Button = builder.get_object("buttons_save").unwrap();
|
||||||
let buttons_save : gtk::Button = builder.get_object("buttons_save").unwrap();
|
// buttons_save.hide();
|
||||||
buttons_save.hide();
|
//
|
||||||
|
// search_for_duplicates_layout(builder);
|
||||||
search_for_duplicates_layout(builder);
|
// }
|
||||||
}
|
// fn search_for_duplicates_layout(builder: Builder) {
|
||||||
fn search_for_duplicates_layout(builder:Builder){
|
// let scrolled_window_duplicate_finder: gtk::ScrolledWindow = builder.get_object("scrolled_window_duplicate_finder").unwrap();
|
||||||
|
//
|
||||||
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);
|
||||||
let name_column : gtk::TreeViewColumn = TreeViewColumn::new();
|
// name_column.set_min_width(50);
|
||||||
name_column.set_title("File Name");
|
//
|
||||||
name_column.set_resizable(true);
|
// let path_column: gtk::TreeViewColumn = TreeViewColumn::new();
|
||||||
name_column.set_min_width(50);
|
// path_column.set_title("Path");
|
||||||
|
// path_column.set_resizable(true);
|
||||||
let path_column : gtk::TreeViewColumn = TreeViewColumn::new();
|
// path_column.set_min_width(50);
|
||||||
path_column.set_title("Path");
|
//
|
||||||
path_column.set_resizable(true);
|
// let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new();
|
||||||
path_column.set_min_width(50);
|
// modification_date_column.set_title("Modification Date");
|
||||||
|
// modification_date_column.set_resizable(true);
|
||||||
let modification_date_column : gtk::TreeViewColumn = TreeViewColumn::new();
|
// modification_date_column.set_min_width(50);
|
||||||
modification_date_column.set_title("Modification Date");
|
//
|
||||||
modification_date_column.set_resizable(true);
|
// let col_types: [glib::types::Type; 2] = [glib::types::Type::String, glib::types::Type::String];
|
||||||
modification_date_column.set_min_width(50);
|
// let list_store: gtk::ListStore = gtk::ListStore::new(&col_types);
|
||||||
|
//
|
||||||
let col_types: [glib::types::Type; 2] = [
|
// let tree_view_duplicate_finder: gtk::TreeView = TreeView::with_model(&list_store);
|
||||||
glib::types::Type::String,
|
//
|
||||||
glib::types::Type::String,
|
// tree_view_duplicate_finder.append_column(&name_column);
|
||||||
];
|
// tree_view_duplicate_finder.append_column(&path_column);
|
||||||
let list_store : gtk::ListStore = gtk::ListStore::new(&col_types);
|
// tree_view_duplicate_finder.append_column(&modification_date_column);
|
||||||
|
//
|
||||||
let tree_view_duplicate_finder : gtk::TreeView = TreeView::with_model(&list_store);
|
// scrolled_window_duplicate_finder.add(&tree_view_duplicate_finder);
|
||||||
|
// scrolled_window_duplicate_finder.show_all();
|
||||||
tree_view_duplicate_finder.append_column(&name_column);
|
// }
|
||||||
tree_view_duplicate_finder.append_column(&path_column);
|
// fn search_for_duplicates(button: >k::Button) {
|
||||||
tree_view_duplicate_finder.append_column(&modification_date_column);
|
// // let info_entry : gtk::Entry = builder.get_object("info_entry").unwrap();
|
||||||
|
// // info_entry.set_text("Duplicated Files");
|
||||||
scrolled_window_duplicate_finder.add(&tree_view_duplicate_finder);
|
//
|
||||||
scrolled_window_duplicate_finder.show_all();
|
// button.hide();
|
||||||
}
|
// let mut df = DuplicateFinder::new();
|
||||||
fn search_for_duplicates(button : >k::Button){// : gtk::Button){
|
// df.set_include_directory("/home/rafal/Pulpit".to_owned());
|
||||||
println!("Szukam");
|
// df.set_exclude_directory("/rafa/".to_owned());
|
||||||
button.hide();
|
// df.set_allowed_extensions("".to_owned());
|
||||||
let mut df = DuplicateFinder::new();
|
// df.set_min_file_size(1000);
|
||||||
df.set_include_directory("/home/rafal/Pulpit".to_owned());
|
// df.find_duplicates(&CheckingMethod::HASH, &DeleteMethod::None);
|
||||||
df.set_exclude_directory("/rafa/".to_owned());
|
// button.show();
|
||||||
df.set_allowed_extensions("".to_owned());
|
//
|
||||||
df.set_min_file_size(1000);
|
// // info_entry.set_text("Found TODO duplicates files in TODO groups which took TODO GB/MB/KB/B");
|
||||||
df.find_duplicates(&CheckingMethod::HASH, &DeleteMethod::None);
|
// }
|
||||||
button.show();
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue