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)
|
||||
- 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 |
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 : >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();
|
||||
}
|
||||
// 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");
|
||||
// }
|
||||
|
|
Loading…
Reference in New Issue