1
0
Fork 0
mirror of synced 2024-04-27 17:22:13 +12:00

Add select for all modes (#102)

This commit is contained in:
Rafał Mikrut 2020-11-09 10:09:22 +01:00 committed by GitHub
parent 3e61544ec4
commit 88d47e49cf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 663 additions and 380 deletions

View file

@ -213,7 +213,6 @@ impl DuplicateFinder {
}
fn check_files_name(&mut self, stop_receiver: Option<&Receiver<()>>) -> bool {
// TODO maybe add multithreading checking files
let start_time: SystemTime = SystemTime::now();
let mut folders_to_check: Vec<PathBuf> = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector
@ -351,7 +350,6 @@ impl DuplicateFinder {
/// Read file length and puts it to different boxes(each for different lengths)
/// If in box is only 1 result, then it is removed
fn check_files_size(&mut self, stop_receiver: Option<&Receiver<()>>) -> bool {
// TODO maybe add multithreading checking files
let start_time: SystemTime = SystemTime::now();
let mut folders_to_check: Vec<PathBuf> = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector

View file

@ -32,7 +32,7 @@ Author: Rafał Mikrut
<!-- interface-name Czkawka -->
<!-- interface-description Czkawka is simple and fast app to find duplicates, empty folders etc. -->
<!-- interface-authors Rafa\305\202 Mikrut -->
<object class="GtkPopover" id="popover_select">
<object class="GtkPopover" id="popover_select_duplicate">
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
@ -40,7 +40,7 @@ Author: Rafał Mikrut
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkButton" id="buttons_popover_select_all">
<object class="GtkButton" id="buttons_popover_duplicate_select_all">
<property name="label" translatable="yes">Select All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -53,7 +53,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_unselect_all">
<object class="GtkButton" id="buttons_popover_duplicate_unselect_all">
<property name="label" translatable="yes">Unselect All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -66,7 +66,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_reverse">
<object class="GtkButton" id="buttons_popover_duplicate_reverse">
<property name="label" translatable="yes">Reverse Selection</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -79,7 +79,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_select_all_except_oldest">
<object class="GtkButton" id="buttons_popover_duplicate_select_all_except_oldest">
<property name="label" translatable="yes">Select all except oldest</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -92,7 +92,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_select_all_except_newest">
<object class="GtkButton" id="buttons_popover_duplicate_select_all_except_newest">
<property name="label" translatable="yes">Select all except newest</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -105,7 +105,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_select_one_oldest">
<object class="GtkButton" id="buttons_popover_duplicate_select_one_oldest">
<property name="label" translatable="yes">Select one oldest</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -118,7 +118,7 @@ Author: Rafał Mikrut
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_select_one_newest">
<object class="GtkButton" id="buttons_popover_duplicate_select_one_newest">
<property name="label" translatable="yes">Select one newest</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -133,6 +133,55 @@ Author: Rafał Mikrut
</object>
</child>
</object>
<object class="GtkPopover" id="popover_select_simple_list">
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkButton" id="buttons_popover_simple_list_select_all">
<property name="label" translatable="yes">Select All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_simple_list_unselect_all">
<property name="label" translatable="yes">Unselect All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="buttons_popover_simple_list_reverse">
<property name="label" translatable="yes">Reverse Selection</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="window_main">
<property name="can_focus">False</property>
<property name="default_width">1100</property>

View file

@ -225,11 +225,11 @@ fn basic_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, col
text_view_errors.get_buffer().unwrap().set_text(messages.as_str());
selection.unselect_all();
} // TODO, will replace simple remove of things
}
// Remove all ocurences - remove every element which have same path and name as even non selected ones
// Remove all occurrences - remove every element which have same path and name as even non selected ones
//
fn tree_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, column_path: i32, column_color: i32, gui_data: &GuiData, remove_all_occurences: bool, header_can_have_one_child: bool) {
fn tree_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, column_path: i32, column_color: i32, gui_data: &GuiData, remove_all_occurrences: bool, header_can_have_one_child: bool) {
let text_view_errors = gui_data.text_view_errors.clone();
let tree_view = scrolled_window.get_children().get(0).unwrap().clone().downcast::<gtk::TreeView>().unwrap();
@ -248,12 +248,12 @@ fn tree_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, colu
let mut vec_path_to_delete: Vec<(String, String)> = Vec::new();
let mut map_with_path_to_delete: BTreeMap<String, Vec<String>> = Default::default(); // BTreeMap<Path,Vec<FileName>>
// Save to variable paths of files, and remove it when not removing all ocureences.
// Save to variable paths of files, and remove it when not removing all occurrences.
for tree_path in selection_rows.iter().rev() {
let file_name = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), column_file_name).get::<String>().unwrap().unwrap();
let path = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), column_path).get::<String>().unwrap().unwrap();
if !remove_all_occurences {
if !remove_all_occurrences {
list_store.remove(&list_store.get_iter(tree_path).unwrap());
}
map_with_path_to_delete.entry(path.clone()).or_insert_with(Vec::new);
@ -277,7 +277,7 @@ fn tree_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, colu
}
}
if remove_all_occurences {
if remove_all_occurrences {
// Must be deleted from end to start, because when deleting entries, TreePath(and also TreeIter) will points to invalid data
for path_to_delete in vec_path_to_delete {
let mut vec_tree_path_to_delete: Vec<gtk::TreePath> = Vec::new();
@ -286,7 +286,7 @@ fn tree_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, colu
Some(t) => t,
None => break,
};
let mut take_child_mode = false; // When original image is searched one, we must remove all occurences of its children
let mut take_child_mode = false; // When original image is searched one, we must remove all occurrences of its children
let mut prepared_for_delete;
loop {
prepared_for_delete = false;

View file

@ -6,15 +6,18 @@ pub fn connect_button_select(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let buttons_select_clone = gui_data.buttons_select.clone();
let popover_select = gui_data.popover_select.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let popover_select_simple_list = gui_data.popover_select_simple_list.clone();
let buttons_select = gui_data.buttons_select.clone();
buttons_select_clone.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
// Only popup popup
popover_select.set_relative_to(Some(&buttons_select));
popover_select.popup();
"notebook_main_duplicate_finder_label" | "notebook_main_same_music_finder" | "notebook_main_similar_images_finder_label" => {
popover_select_duplicate.set_relative_to(Some(&buttons_select));
popover_select_duplicate.popup();
}
"scrolled_window_main_empty_folder_finder" | "scrolled_window_main_empty_files_finder" | "scrolled_window_main_temporary_files_finder" | "notebook_big_main_file_finder" | "notebook_main_zeroed_files_finder" => {
popover_select_simple_list.set_relative_to(Some(&buttons_select));
popover_select_simple_list.popup();
}
// TODO add for all basic selection popup
e => panic!("Not existent {}", e),
});
}

View file

@ -229,9 +229,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if empty_folder_number > 0 {
*shared_buttons.borrow_mut().get_mut("empty_folder").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("empty_folder").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("empty_folder").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("empty_folder").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("empty_folder").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("empty_folder").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("empty_folder").unwrap(), &buttons_array, &buttons_names);
}
@ -271,9 +273,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if empty_files_number > 0 {
*shared_buttons.borrow_mut().get_mut("empty_file").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("empty_file").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("empty_file").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("empty_file").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("empty_file").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("empty_file").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("empty_file").unwrap(), &buttons_array, &buttons_names);
}
@ -320,9 +324,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if biggest_files_number > 0 {
*shared_buttons.borrow_mut().get_mut("big_file").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("big_file").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("big_file").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("big_file").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("big_file").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("big_file").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("big_file").unwrap(), &buttons_array, &buttons_names);
}
@ -362,9 +368,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if temporary_files_number > 0 {
*shared_buttons.borrow_mut().get_mut("temporary_file").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("temporary_file").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("temporary_file").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("temporary_file").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("temporary_file").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("temporary_file").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("temporary_file").unwrap(), &buttons_array, &buttons_names);
}
@ -385,19 +393,20 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
{
let list_store = get_list_store(&scrolled_window_similar_images_finder);
let col_indices = [0, 1, 2, 3, 4, 5, 6, 7];
let col_indices = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let vec_struct_similar = sf.get_similar_images();
for vec_file_entry in vec_struct_similar.iter() {
// Header
let values: [&dyn ToValue; 8] = [
let values: [&dyn ToValue; 9] = [
&"".to_string(),
&"".to_string(),
&"".to_string(),
&"".to_string(),
&"".to_string(),
&"".to_string(),
&(0),
&(HEADER_ROW_COLOR.to_string()),
&(TEXT_COLOR.to_string()),
];
@ -406,13 +415,14 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
// Meat
for file_entry in vec_file_entry.iter() {
let (directory, file) = split_path(&file_entry.path);
let values: [&dyn ToValue; 8] = [
let values: [&dyn ToValue; 9] = [
&(get_text_from_similarity(&file_entry.similarity).to_string()),
&file_entry.size.file_size(options::BINARY).unwrap(),
&file_entry.dimensions,
&file,
&directory,
&(NaiveDateTime::from_timestamp(file_entry.modified_date as i64, 0).to_string()),
&(file_entry.modified_date),
&(MAIN_ROW_COLOR.to_string()),
&(TEXT_COLOR.to_string()),
];
@ -430,9 +440,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if base_images_size > 0 {
*shared_buttons.borrow_mut().get_mut("similar_images").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("similar_images").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("similar_images").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("similar_images").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("similar_images").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("similar_images").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("similar_images").unwrap(), &buttons_array, &buttons_names);
}
@ -477,9 +489,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if zeroed_files_number > 0 {
*shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("zeroed_files").unwrap(), &buttons_array, &buttons_names);
}
@ -540,7 +554,7 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
false => "".to_string(),
}),
&"".to_string(),
&"".to_string(),
&(0),
&(HEADER_ROW_COLOR.to_string()),
&(TEXT_COLOR.to_string()),
];
@ -574,9 +588,11 @@ pub fn connect_compute_results(gui_data: &GuiData, receiver: Receiver<Message>)
if same_music_number > 0 {
*shared_buttons.borrow_mut().get_mut("same_music").unwrap().get_mut("save").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("same_music").unwrap().get_mut("delete").unwrap() = true;
*shared_buttons.borrow_mut().get_mut("same_music").unwrap().get_mut("select").unwrap() = true;
} else {
*shared_buttons.borrow_mut().get_mut("same_music").unwrap().get_mut("save").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("same_music").unwrap().get_mut("delete").unwrap() = false;
*shared_buttons.borrow_mut().get_mut("same_music").unwrap().get_mut("select").unwrap() = false;
}
set_buttons(&mut *shared_buttons.borrow_mut().get_mut("same_music").unwrap(), &buttons_array, &buttons_names);
}

View file

@ -1,322 +0,0 @@
extern crate gtk;
use crate::gui_data::GuiData;
use crate::help_functions::*;
use gtk::prelude::*;
use gtk::TreeIter;
pub fn connect_popover_duplicate(gui_data: &GuiData) {
// Select all button
{
let buttons_popover_select_all = gui_data.buttons_popover_select_all.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select = gui_data.popover_select.clone();
buttons_popover_select_all.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
selection.select_all();
popover_select.popdown();
});
}
// Unselect all button
{
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let buttons_popover_unselect_all = gui_data.buttons_popover_unselect_all.clone();
let popover_select = gui_data.popover_select.clone();
buttons_popover_unselect_all.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
selection.unselect_all();
popover_select.popdown();
});
}
// Reverse selection
{
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select = gui_data.popover_select.clone();
let buttons_popover_reverse = gui_data.buttons_popover_reverse.clone();
buttons_popover_reverse.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
let (vector_tree_path, tree_model) = selection.get_selected_rows();
if vector_tree_path.is_empty() {
selection.select_all();
} else {
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut current_path_index = 0;
let mut tree_iter_selected: TreeIter;
loop {
if current_path_index >= vector_tree_path.len() {
selection.select_iter(&tree_iter_all);
} else {
tree_iter_selected = tree_model.get_iter(vector_tree_path.get(current_path_index).unwrap()).unwrap();
if tree_model.get_path(&tree_iter_all).unwrap() == tree_model.get_path(&tree_iter_selected).unwrap() {
selection.unselect_iter(&tree_iter_selected);
current_path_index += 1;
} else {
selection.select_iter(&tree_iter_all);
}
}
if !tree_model.iter_next(&tree_iter_all) {
break;
}
}
}
popover_select.popdown();
});
}
// All except oldest
{
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select = gui_data.popover_select.clone();
let buttons_popover_select_all_except_oldest = gui_data.buttons_popover_select_all_except_oldest.clone();
buttons_popover_select_all_except_oldest.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut oldest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut oldest_modification_time: u64 = u64::max_value();
loop {
let color = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::Color as i32).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::ModificationAsSecs as i32).get::<u64>().unwrap().unwrap();
if modification < oldest_modification_time {
oldest_modification_time = modification;
oldest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if oldest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index != oldest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover_select.popdown();
});
}
// All except newest
{
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select = gui_data.popover_select.clone();
let buttons_popover_select_all_except_newest = gui_data.buttons_popover_select_all_except_newest.clone();
buttons_popover_select_all_except_newest.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut newest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut newest_modification_time: u64 = 0;
loop {
let color = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::Color as i32).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::ModificationAsSecs as i32).get::<u64>().unwrap().unwrap();
if modification > newest_modification_time {
newest_modification_time = modification;
newest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if newest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index != newest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover_select.popdown();
});
}
// All one oldest
{
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select = gui_data.popover_select.clone();
let buttons_popover_select_one_oldest = gui_data.buttons_popover_select_one_oldest.clone();
buttons_popover_select_one_oldest.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut oldest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut oldest_modification_time: u64 = u64::max_value();
loop {
let color = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::Color as i32).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::ModificationAsSecs as i32).get::<u64>().unwrap().unwrap();
if modification < oldest_modification_time {
oldest_modification_time = modification;
oldest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if oldest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index == oldest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover_select.popdown();
});
}
// All one newest
{
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let buttons_popover_select_one_newest = gui_data.buttons_popover_select_one_newest.clone();
let popover_select = gui_data.popover_select.clone();
buttons_popover_select_one_newest.connect_clicked(move |_| {
let tree_view = get_tree_view(&scrolled_window_duplicate_finder);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut newest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut newest_modification_time: u64 = 0;
loop {
let color = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::Color as i32).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, ColumnsDuplicates::ModificationAsSecs as i32).get::<u64>().unwrap().unwrap();
if modification > newest_modification_time {
newest_modification_time = modification;
newest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if newest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index == newest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover_select.popdown();
});
}
}

View file

@ -0,0 +1,524 @@
extern crate gtk;
use crate::gui_data::GuiData;
use crate::help_functions::*;
use gtk::prelude::*;
use gtk::TreeIter;
fn popover_select_all(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
selection.select_all();
popover.popdown();
}
fn popover_unselect_all(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
selection.unselect_all();
popover.popdown();
}
fn popover_reverse(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
let (vector_tree_path, tree_model) = selection.get_selected_rows();
if vector_tree_path.is_empty() {
selection.select_all();
} else {
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut current_path_index = 0;
let mut tree_iter_selected: TreeIter;
loop {
if current_path_index >= vector_tree_path.len() {
selection.select_iter(&tree_iter_all);
} else {
tree_iter_selected = tree_model.get_iter(vector_tree_path.get(current_path_index).unwrap()).unwrap();
if tree_model.get_path(&tree_iter_all).unwrap() == tree_model.get_path(&tree_iter_selected).unwrap() {
selection.unselect_iter(&tree_iter_selected);
current_path_index += 1;
} else {
selection.select_iter(&tree_iter_all);
}
}
if !tree_model.iter_next(&tree_iter_all) {
break;
}
}
}
popover.popdown();
}
fn popover_all_except_oldest(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow, column_color: i32, column_modification_as_secs: i32) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut oldest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut oldest_modification_time: u64 = u64::max_value();
loop {
let color = tree_model.get_value(&tree_iter_all, column_color).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, column_modification_as_secs).get::<u64>().unwrap().unwrap();
if modification < oldest_modification_time {
oldest_modification_time = modification;
oldest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if oldest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index != oldest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover.popdown();
}
fn popover_all_except_newest(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow, column_color: i32, column_modification_as_secs: i32) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut newest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut newest_modification_time: u64 = 0;
loop {
let color = tree_model.get_value(&tree_iter_all, column_color).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, column_modification_as_secs).get::<u64>().unwrap().unwrap();
if modification > newest_modification_time {
newest_modification_time = modification;
newest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if newest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index != newest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover.popdown();
}
fn popover_one_oldest(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow, column_color: i32, column_modification_as_secs: i32) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut oldest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut oldest_modification_time: u64 = u64::max_value();
loop {
let color = tree_model.get_value(&tree_iter_all, column_color).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, column_modification_as_secs).get::<u64>().unwrap().unwrap();
if modification < oldest_modification_time {
oldest_modification_time = modification;
oldest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if oldest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index == oldest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover.popdown();
}
fn popover_one_newest(popover: &gtk::Popover, scrolled_window: &gtk::ScrolledWindow, column_color: i32, column_modification_as_secs: i32) {
let tree_view = get_tree_view(&scrolled_window);
let selection = tree_view.get_selection();
let tree_model = tree_view.get_model().unwrap();
let tree_iter_all = tree_model.get_iter_first().unwrap(); // Never should be available button where there is no available records
let mut end: bool = false;
loop {
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
let mut newest_index: Option<usize> = None;
let mut current_index: usize = 0;
let mut newest_modification_time: u64 = 0;
loop {
let color = tree_model.get_value(&tree_iter_all, column_color).get::<String>().unwrap().unwrap();
if color == HEADER_ROW_COLOR {
if !tree_model.iter_next(&tree_iter_all) {
end = true;
}
break;
}
tree_iter_array.push(tree_iter_all.clone());
let modification = tree_model.get_value(&tree_iter_all, column_modification_as_secs).get::<u64>().unwrap().unwrap();
if modification > newest_modification_time {
newest_modification_time = modification;
newest_index = Some(current_index);
}
current_index += 1;
if !tree_model.iter_next(&tree_iter_all) {
end = true;
break;
}
}
if newest_index == None {
continue;
}
for (index, tree_iter) in tree_iter_array.iter().enumerate() {
if index == newest_index.unwrap() {
selection.select_iter(tree_iter);
} else {
selection.unselect_iter(tree_iter);
}
}
if end {
break;
}
}
popover.popdown();
}
pub fn connect_popovers(gui_data: &GuiData) {
connect_select_all(&gui_data);
connect_unselect_all(&gui_data);
connect_reverse(&gui_data);
connect_all_except_oldest(&gui_data);
connect_all_except_newest(&gui_data);
connect_one_oldest(&gui_data);
connect_one_newest(&gui_data);
}
pub fn connect_select_all(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_main_empty_folder_finder = gui_data.scrolled_window_main_empty_folder_finder.clone();
let scrolled_window_big_files_finder = gui_data.scrolled_window_big_files_finder.clone();
let scrolled_window_main_empty_files_finder = gui_data.scrolled_window_main_empty_files_finder.clone();
let scrolled_window_main_temporary_files_finder = gui_data.scrolled_window_main_temporary_files_finder.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_zeroed_files_finder = gui_data.scrolled_window_zeroed_files_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let popover_select_simple_list = gui_data.popover_select_simple_list.clone();
let buttons_popover_simple_list_select_all = gui_data.buttons_popover_simple_list_select_all.clone();
let buttons_popover_duplicate_select_all = gui_data.buttons_popover_duplicate_select_all.clone();
buttons_popover_duplicate_select_all.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_select_all(&popover_select_duplicate, &scrolled_window_duplicate_finder);
}
"notebook_main_same_music_finder" => {
popover_select_all(&popover_select_duplicate, &scrolled_window_same_music_finder);
}
"notebook_main_similar_images_finder_label" => {
popover_select_all(&popover_select_duplicate, &scrolled_window_similar_images_finder);
}
e => panic!("Not existent {}", e),
});
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
buttons_popover_simple_list_select_all.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"scrolled_window_main_empty_folder_finder" => {
popover_select_all(&popover_select_simple_list, &scrolled_window_main_empty_folder_finder);
}
"scrolled_window_main_empty_files_finder" => {
popover_select_all(&popover_select_simple_list, &scrolled_window_main_empty_files_finder);
}
"scrolled_window_main_temporary_files_finder" => {
popover_select_all(&popover_select_simple_list, &scrolled_window_main_temporary_files_finder);
}
"notebook_main_zeroed_files_finder" => {
popover_select_all(&popover_select_simple_list, &scrolled_window_zeroed_files_finder);
}
"notebook_big_main_file_finder" => {
popover_select_all(&popover_select_simple_list, &scrolled_window_big_files_finder);
}
e => panic!("Not existent {}", e),
});
}
pub fn connect_unselect_all(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_main_empty_folder_finder = gui_data.scrolled_window_main_empty_folder_finder.clone();
let scrolled_window_big_files_finder = gui_data.scrolled_window_big_files_finder.clone();
let scrolled_window_main_empty_files_finder = gui_data.scrolled_window_main_empty_files_finder.clone();
let scrolled_window_main_temporary_files_finder = gui_data.scrolled_window_main_temporary_files_finder.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_zeroed_files_finder = gui_data.scrolled_window_zeroed_files_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let popover_select_simple_list = gui_data.popover_select_simple_list.clone();
let buttons_popover_simple_list_unselect_all = gui_data.buttons_popover_simple_list_unselect_all.clone();
let buttons_popover_duplicate_unselect_all = gui_data.buttons_popover_duplicate_unselect_all.clone();
buttons_popover_duplicate_unselect_all.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_unselect_all(&popover_select_duplicate, &scrolled_window_duplicate_finder);
}
"notebook_main_same_music_finder" => {
popover_unselect_all(&popover_select_duplicate, &scrolled_window_same_music_finder);
}
"notebook_main_similar_images_finder_label" => {
popover_unselect_all(&popover_select_duplicate, &scrolled_window_similar_images_finder);
}
e => panic!("Not existent {}", e),
});
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
buttons_popover_simple_list_unselect_all.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"scrolled_window_main_empty_folder_finder" => {
popover_unselect_all(&popover_select_simple_list, &scrolled_window_main_empty_folder_finder);
}
"scrolled_window_main_empty_files_finder" => {
popover_unselect_all(&popover_select_simple_list, &scrolled_window_main_empty_files_finder);
}
"scrolled_window_main_temporary_files_finder" => {
popover_unselect_all(&popover_select_simple_list, &scrolled_window_main_temporary_files_finder);
}
"notebook_main_zeroed_files_finder" => {
popover_unselect_all(&popover_select_simple_list, &scrolled_window_zeroed_files_finder);
}
"notebook_big_main_file_finder" => {
popover_unselect_all(&popover_select_simple_list, &scrolled_window_big_files_finder);
}
e => panic!("Not existent {}", e),
});
}
pub fn connect_reverse(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_main_empty_folder_finder = gui_data.scrolled_window_main_empty_folder_finder.clone();
let scrolled_window_big_files_finder = gui_data.scrolled_window_big_files_finder.clone();
let scrolled_window_main_empty_files_finder = gui_data.scrolled_window_main_empty_files_finder.clone();
let scrolled_window_main_temporary_files_finder = gui_data.scrolled_window_main_temporary_files_finder.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_zeroed_files_finder = gui_data.scrolled_window_zeroed_files_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let popover_select_simple_list = gui_data.popover_select_simple_list.clone();
let buttons_popover_simple_list_reverse = gui_data.buttons_popover_simple_list_reverse.clone();
let buttons_popover_duplicate_reverse = gui_data.buttons_popover_duplicate_reverse.clone();
buttons_popover_duplicate_reverse.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_reverse(&popover_select_duplicate, &scrolled_window_duplicate_finder);
}
"notebook_main_same_music_finder" => {
popover_reverse(&popover_select_duplicate, &scrolled_window_same_music_finder);
}
"notebook_main_similar_images_finder_label" => {
popover_reverse(&popover_select_duplicate, &scrolled_window_similar_images_finder);
}
e => panic!("Not existent {}", e),
});
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
buttons_popover_simple_list_reverse.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"scrolled_window_main_empty_folder_finder" => {
popover_reverse(&popover_select_simple_list, &scrolled_window_main_empty_folder_finder);
}
"scrolled_window_main_empty_files_finder" => {
popover_reverse(&popover_select_simple_list, &scrolled_window_main_empty_files_finder);
}
"scrolled_window_main_temporary_files_finder" => {
popover_reverse(&popover_select_simple_list, &scrolled_window_main_temporary_files_finder);
}
"notebook_main_zeroed_files_finder" => {
popover_reverse(&popover_select_simple_list, &scrolled_window_zeroed_files_finder);
}
"notebook_big_main_file_finder" => {
popover_reverse(&popover_select_simple_list, &scrolled_window_big_files_finder);
}
e => panic!("Not existent {}", e),
});
}
pub fn connect_all_except_oldest(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let buttons_popover_duplicate_select_all_except_oldest = gui_data.buttons_popover_duplicate_select_all_except_oldest.clone();
buttons_popover_duplicate_select_all_except_oldest.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_all_except_oldest(&popover_select_duplicate, &scrolled_window_duplicate_finder, ColumnsDuplicates::Color as i32, ColumnsDuplicates::ModificationAsSecs as i32);
}
"notebook_main_same_music_finder" => {
popover_all_except_oldest(&popover_select_duplicate, &scrolled_window_same_music_finder, ColumnsSameMusic::Color as i32, ColumnsSameMusic::ModificationAsSecs as i32);
}
"notebook_main_similar_images_finder_label" => {
popover_all_except_oldest(&popover_select_duplicate, &scrolled_window_similar_images_finder, ColumnsSimilarImages::Color as i32, ColumnsSimilarImages::ModificationAsSecs as i32);
}
e => panic!("Not existent {}", e),
});
}
pub fn connect_all_except_newest(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let buttons_popover_duplicate_select_all_except_newest = gui_data.buttons_popover_duplicate_select_all_except_newest.clone();
buttons_popover_duplicate_select_all_except_newest.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_all_except_newest(&popover_select_duplicate, &scrolled_window_duplicate_finder, ColumnsDuplicates::Color as i32, ColumnsDuplicates::ModificationAsSecs as i32);
}
"notebook_main_same_music_finder" => {
popover_all_except_newest(&popover_select_duplicate, &scrolled_window_same_music_finder, ColumnsSameMusic::Color as i32, ColumnsSameMusic::ModificationAsSecs as i32);
}
"notebook_main_similar_images_finder_label" => {
popover_all_except_newest(&popover_select_duplicate, &scrolled_window_similar_images_finder, ColumnsSimilarImages::Color as i32, ColumnsSimilarImages::ModificationAsSecs as i32);
}
e => panic!("Not existent {}", e),
});
}
pub fn connect_one_newest(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let buttons_popover_duplicate_select_one_newest = gui_data.buttons_popover_duplicate_select_one_newest.clone();
buttons_popover_duplicate_select_one_newest.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_one_newest(&popover_select_duplicate, &scrolled_window_duplicate_finder, ColumnsDuplicates::Color as i32, ColumnsDuplicates::ModificationAsSecs as i32);
}
"notebook_main_same_music_finder" => {
popover_one_newest(&popover_select_duplicate, &scrolled_window_same_music_finder, ColumnsSameMusic::Color as i32, ColumnsSameMusic::ModificationAsSecs as i32);
}
"notebook_main_similar_images_finder_label" => {
popover_one_newest(&popover_select_duplicate, &scrolled_window_similar_images_finder, ColumnsSimilarImages::Color as i32, ColumnsSimilarImages::ModificationAsSecs as i32);
}
e => panic!("Not existent {}", e),
});
}
pub fn connect_one_oldest(gui_data: &GuiData) {
let notebook_main_children_names = gui_data.notebook_main_children_names.clone();
let notebook_main = gui_data.notebook_main.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let popover_select_duplicate = gui_data.popover_select_duplicate.clone();
let buttons_popover_duplicate_select_one_oldest = gui_data.buttons_popover_duplicate_select_one_oldest.clone();
buttons_popover_duplicate_select_one_oldest.connect_clicked(move |_| match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => {
popover_one_oldest(&popover_select_duplicate, &scrolled_window_duplicate_finder, ColumnsDuplicates::Color as i32, ColumnsDuplicates::ModificationAsSecs as i32);
}
"notebook_main_same_music_finder" => {
popover_one_oldest(&popover_select_duplicate, &scrolled_window_same_music_finder, ColumnsSameMusic::Color as i32, ColumnsSameMusic::ModificationAsSecs as i32);
}
"notebook_main_similar_images_finder_label" => {
popover_one_oldest(&popover_select_duplicate, &scrolled_window_similar_images_finder, ColumnsSimilarImages::Color as i32, ColumnsSimilarImages::ModificationAsSecs as i32);
}
e => panic!("Not existent {}", e),
});
}

View file

@ -71,16 +71,21 @@ pub struct GuiData {
pub buttons_remove_excluded_directory: gtk::Button,
// Buttons search popover buttons
pub buttons_popover_select_all: gtk::Button,
pub buttons_popover_unselect_all: gtk::Button,
pub buttons_popover_reverse: gtk::Button,
pub buttons_popover_select_all_except_oldest: gtk::Button,
pub buttons_popover_select_all_except_newest: gtk::Button,
pub buttons_popover_select_one_oldest: gtk::Button,
pub buttons_popover_select_one_newest: gtk::Button,
pub buttons_popover_duplicate_select_all: gtk::Button,
pub buttons_popover_duplicate_unselect_all: gtk::Button,
pub buttons_popover_duplicate_reverse: gtk::Button,
pub buttons_popover_duplicate_select_all_except_oldest: gtk::Button,
pub buttons_popover_duplicate_select_all_except_newest: gtk::Button,
pub buttons_popover_duplicate_select_one_oldest: gtk::Button,
pub buttons_popover_duplicate_select_one_newest: gtk::Button,
pub buttons_popover_simple_list_select_all: gtk::Button,
pub buttons_popover_simple_list_unselect_all: gtk::Button,
pub buttons_popover_simple_list_reverse: gtk::Button,
//// Popovers
pub popover_select: gtk::Popover,
pub popover_select_duplicate: gtk::Popover,
pub popover_select_simple_list: gtk::Popover,
//// Check Buttons
pub check_button_recursive: gtk::CheckButton,
@ -251,16 +256,21 @@ impl GuiData {
let buttons_remove_excluded_directory: gtk::Button = builder.get_object("buttons_remove_excluded_directory").unwrap();
// Buttons search popover buttons
let buttons_popover_select_all: gtk::Button = builder.get_object("buttons_popover_select_all").unwrap();
let buttons_popover_unselect_all: gtk::Button = builder.get_object("buttons_popover_unselect_all").unwrap();
let buttons_popover_reverse: gtk::Button = builder.get_object("buttons_popover_reverse").unwrap();
let buttons_popover_select_all_except_oldest: gtk::Button = builder.get_object("buttons_popover_select_all_except_oldest").unwrap();
let buttons_popover_select_all_except_newest: gtk::Button = builder.get_object("buttons_popover_select_all_except_newest").unwrap();
let buttons_popover_select_one_oldest: gtk::Button = builder.get_object("buttons_popover_select_one_oldest").unwrap();
let buttons_popover_select_one_newest: gtk::Button = builder.get_object("buttons_popover_select_one_newest").unwrap();
let buttons_popover_duplicate_select_all: gtk::Button = builder.get_object("buttons_popover_duplicate_select_all").unwrap();
let buttons_popover_duplicate_unselect_all: gtk::Button = builder.get_object("buttons_popover_duplicate_unselect_all").unwrap();
let buttons_popover_duplicate_reverse: gtk::Button = builder.get_object("buttons_popover_duplicate_reverse").unwrap();
let buttons_popover_duplicate_select_all_except_oldest: gtk::Button = builder.get_object("buttons_popover_duplicate_select_all_except_oldest").unwrap();
let buttons_popover_duplicate_select_all_except_newest: gtk::Button = builder.get_object("buttons_popover_duplicate_select_all_except_newest").unwrap();
let buttons_popover_duplicate_select_one_oldest: gtk::Button = builder.get_object("buttons_popover_duplicate_select_one_oldest").unwrap();
let buttons_popover_duplicate_select_one_newest: gtk::Button = builder.get_object("buttons_popover_duplicate_select_one_newest").unwrap();
let buttons_popover_simple_list_select_all: gtk::Button = builder.get_object("buttons_popover_simple_list_select_all").unwrap();
let buttons_popover_simple_list_unselect_all: gtk::Button = builder.get_object("buttons_popover_simple_list_unselect_all").unwrap();
let buttons_popover_simple_list_reverse: gtk::Button = builder.get_object("buttons_popover_simple_list_reverse").unwrap();
//// Popovers
let popover_select: gtk::Popover = builder.get_object("popover_select").unwrap();
let popover_select_duplicate: gtk::Popover = builder.get_object("popover_select_duplicate").unwrap();
let popover_select_simple_list: gtk::Popover = builder.get_object("popover_select_simple_list").unwrap();
//// Check Buttons
let check_button_recursive: gtk::CheckButton = builder.get_object("check_button_recursive").unwrap();
@ -359,14 +369,18 @@ impl GuiData {
buttons_remove_included_directory,
buttons_add_excluded_directory,
buttons_remove_excluded_directory,
buttons_popover_select_all,
buttons_popover_unselect_all,
buttons_popover_reverse,
buttons_popover_select_all_except_oldest,
buttons_popover_select_all_except_newest,
buttons_popover_select_one_oldest,
buttons_popover_select_one_newest,
popover_select,
buttons_popover_duplicate_select_all,
buttons_popover_duplicate_unselect_all,
buttons_popover_duplicate_reverse,
buttons_popover_duplicate_select_all_except_oldest,
buttons_popover_duplicate_select_all_except_newest,
buttons_popover_duplicate_select_one_oldest,
buttons_popover_duplicate_select_one_newest,
buttons_popover_simple_list_select_all,
buttons_popover_simple_list_unselect_all,
buttons_popover_simple_list_reverse,
popover_select_duplicate,
popover_select_simple_list,
check_button_recursive,
check_button_music_title,
check_button_music_artist,

View file

@ -66,6 +66,7 @@ pub enum ColumnsSimilarImages {
Name,
Path,
Modification,
ModificationAsSecs,
Color,
TextColor,
}
@ -85,7 +86,7 @@ pub enum ColumnsSameMusic {
AlbumArtist,
Year,
Modification,
_ModificationAsSecs,
ModificationAsSecs,
Color,
TextColor,
}

View file

@ -5,7 +5,7 @@ mod connect_button_select;
mod connect_button_stop;
mod connect_compute_results;
mod connect_notebook_tabs;
mod connect_popover_duplicate;
mod connect_popovers;
mod connect_upper_notebook;
mod create_tree_view;
mod double_click_opening;
@ -23,7 +23,7 @@ use crate::connect_button_select::*;
use crate::connect_button_stop::*;
use crate::connect_compute_results::*;
use crate::connect_notebook_tabs::*;
use crate::connect_popover_duplicate::*;
use crate::connect_popovers::*;
use crate::connect_upper_notebook::*;
use crate::gui_data::*;
use crate::startup_configuration::*;
@ -62,7 +62,7 @@ fn main() {
connect_button_stop(&gui_data);
connect_notebook_tabs(&gui_data);
connect_upper_notebook(&gui_data);
connect_popover_duplicate(&gui_data);
connect_popovers(&gui_data);
connect_compute_results(&gui_data, receiver);
// Quit the program when X in main window was clicked

View file

@ -132,14 +132,14 @@ pub fn startup_configuration(gui_data: &GuiData) {
}
// Similar Images
{
// TODO create maybe open button to support opening multiple files at once
let col_types: [glib::types::Type; 8] = [
let col_types: [glib::types::Type; 9] = [
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::U64,
glib::types::Type::String,
glib::types::Type::String,
];
@ -185,7 +185,7 @@ pub fn startup_configuration(gui_data: &GuiData) {
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::U64,
glib::types::Type::String,
glib::types::Type::String,
];