Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Implement sorting by portion checked within group #538

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions czkawka_gui/src/compute_results.rs
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::Duplicate,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&["save", "delete", "select", "symlink", "hardlink", "move", "sort"],
duplicates_number > 0,
);

Expand Down Expand Up @@ -565,7 +565,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::EmptyDirectories,
&["save", "delete", "select", "move"],
&["save", "delete", "select", "move", "sort"],
empty_folder_number > 0,
);

Expand Down Expand Up @@ -631,7 +631,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::EmptyFiles,
&["save", "delete", "select", "move"],
&["save", "delete", "select", "move", "sort"],
empty_files_number > 0,
);

Expand Down Expand Up @@ -699,7 +699,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::BigFiles,
&["save", "delete", "select", "move"],
&["save", "delete", "select", "move", "sort"],
biggest_files_number > 0,
);

Expand Down Expand Up @@ -764,7 +764,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::Temporary,
&["save", "delete", "select", "move"],
&["save", "delete", "select", "move", "sort"],
temporary_files_number > 0,
);

Expand Down Expand Up @@ -940,7 +940,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::SimilarImages,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&["save", "delete", "select", "symlink", "hardlink", "move", "sort"],
found_any_duplicates,
);

Expand Down Expand Up @@ -1102,7 +1102,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::SimilarVideos,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&["save", "delete", "select", "symlink", "hardlink", "move", "sort"],
found_any_duplicates,
);

Expand Down Expand Up @@ -1317,7 +1317,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::SameMusic,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&["save", "delete", "select", "symlink", "hardlink", "move", "sort"],
same_music_number > 0,
);

Expand Down Expand Up @@ -1383,7 +1383,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
{
*shared_same_invalid_symlinks.borrow_mut() = ifs;

set_specific_buttons_as_active(&shared_buttons, &NotebookMainEnum::Symlinks, &["save", "delete", "select", "move"], invalid_symlinks > 0);
set_specific_buttons_as_active(&shared_buttons, &NotebookMainEnum::Symlinks, &["save", "delete", "select", "move", "sort"], invalid_symlinks > 0);

set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::Symlinks).unwrap(),
Expand Down Expand Up @@ -1448,7 +1448,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::BrokenFiles,
&["save", "delete", "select", "move"],
&["save", "delete", "select", "move", "sort"],
broken_files_number > 0,
);

Expand Down
26 changes: 26 additions & 0 deletions czkawka_gui/src/connect_button_sort.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use gtk::prelude::*;

use crate::gui_data::GuiData;
use crate::gui_popovers::GuiPopovers;
// use crate::help_functions::{PopoverTypes, NOTEBOOKS_INFOS};
use crate::notebook_enums::*;

pub fn connect_button_sort(gui_data: &GuiData) {
let popovers = gui_data.popovers.clone();
let notebook_main = gui_data.main_notebook.notebook_main.clone();
let popover_sort = gui_data.popovers.popover_sort.clone();
let buttons_sort = gui_data.bottom_buttons.buttons_sort.clone();

buttons_sort.connect_clicked(move |_| {
show_required_popovers(&popovers, &to_notebook_main_enum(notebook_main.current_page().unwrap()));
popover_sort.popup();
});
}

fn show_required_popovers(popovers: &GuiPopovers, _current_mode: &NotebookMainEnum) {
let buttons_popover_sort_portion_ascending = popovers.buttons_popover_sort_portion_ascending.clone();
let buttons_popover_sort_portion_descending = popovers.buttons_popover_sort_portion_descending.clone();

buttons_popover_sort_portion_ascending.show();
buttons_popover_sort_portion_descending.show();
}
119 changes: 109 additions & 10 deletions czkawka_gui/src/connect_popovers.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::ops::Range;

use gtk::prelude::*;
use gtk::{ResponseType, TreeIter, Window};
use regex::Regex;
Expand Down Expand Up @@ -576,6 +578,89 @@ fn popover_all_except_biggest_smallest(
popover.popdown();
}

enum Sort {
Portion {
direction: Direction,
column_button_selection: i32,
}
}

#[derive(Copy, Clone, Eq, PartialEq)]
enum Direction {
Ascending,
Descending,
}

fn popover_sort_list(
popover: &gtk::Popover,
tree_view: &gtk::TreeView,
column_color: i32,
sort: Sort,
) {
let model = get_list_store(tree_view);

let mut list: Vec<(f64, Range<usize>)> = vec![];
if let Some(iter) = model.iter_first() {
let mut end: bool = false;
let mut current_index_outer: usize = 0;
loop {
let mut current_index: usize = 0;
let mut num_selected: usize = 0;

// Per-group

// Skip header
let color = model.value(&iter, column_color).get::<String>().unwrap();
assert_eq!(color, HEADER_ROW_COLOR);
if !model.iter_next(&iter) {
break;
}

current_index_outer += 1;

loop {
// Per-row
let color = model.value(&iter, column_color).get::<String>().unwrap();
if color == HEADER_ROW_COLOR {
break;
} else {
match sort {
Sort::Portion { column_button_selection, direction } => {
let selection = model.value(&iter, column_button_selection).get::<bool>().unwrap();
if selection ^ (direction == Direction::Descending) {
num_selected += 1;
}
}
}
}

current_index += 1;
current_index_outer += 1;

if !model.iter_next(&iter) {
end = true;
break;
}
}

// Per-group
let range = current_index_outer - current_index - 1 .. current_index_outer;

list.push((num_selected as f64 / current_index as f64, range));

if end {
break;
}
}
}

list.sort_by(|&(portion_a, _), &(portion_b, _)| { portion_a.partial_cmp(&portion_b).unwrap() });
let oldpos: Vec<_> = list.into_iter().flat_map(|(_, range)| range).map(|v| v as u32).collect();
model.reorder(&oldpos[..]);

popover.popdown();
}

pub fn connect_popovers(gui_data: &GuiData) {
let popover_select = gui_data.popovers.popover_select.clone();
let buttons_popover_select_all = gui_data.popovers.buttons_popover_select_all.clone();
Expand Down Expand Up @@ -758,23 +843,37 @@ pub fn connect_popovers(gui_data: &GuiData) {
);
});

let popover_select = gui_data.popovers.popover_select.clone();
let buttons_popover_select_all_images_except_smallest = gui_data.popovers.buttons_popover_select_all_images_except_smallest.clone();
let popover_sort = gui_data.popovers.popover_sort.clone();
let buttons_popover_sort_portion_ascending = gui_data.popovers.buttons_popover_sort_portion_ascending.clone();
let notebook_main = gui_data.main_notebook.notebook_main.clone();
let main_tree_views = gui_data.main_notebook.get_main_tree_views();
buttons_popover_select_all_images_except_smallest.connect_clicked(move |_| {
buttons_popover_sort_portion_ascending.connect_clicked(move |_| {
let nb_number = notebook_main.current_page().unwrap();
let tree_view = &main_tree_views[nb_number as usize];
let nb_object = &NOTEBOOKS_INFOS[nb_number as usize];

popover_all_except_biggest_smallest(
&popover_select,
popover_sort_list(
&popover_sort,
tree_view,
nb_object.column_color.expect("AES can't be used without headers"),
nb_object.column_size_as_bytes.expect("AES needs size as bytes column"),
nb_object.column_dimensions,
nb_object.column_selection as u32,
false,
nb_object.column_color.expect("sort can't be used without headers"),
Sort::Portion { column_button_selection: nb_object.column_selection, direction: Direction::Ascending },
);
});

let popover_sort = gui_data.popovers.popover_sort.clone();
let buttons_popover_sort_portion_descending = gui_data.popovers.buttons_popover_sort_portion_descending.clone();
let notebook_main = gui_data.main_notebook.notebook_main.clone();
let main_tree_views = gui_data.main_notebook.get_main_tree_views();
buttons_popover_sort_portion_descending.connect_clicked(move |_| {
let nb_number = notebook_main.current_page().unwrap();
let tree_view = &main_tree_views[nb_number as usize];
let nb_object = &NOTEBOOKS_INFOS[nb_number as usize];

popover_sort_list(
&popover_sort,
tree_view,
nb_object.column_color.expect("sort can't be used without headers"),
Sort::Portion { column_button_selection: nb_object.column_selection, direction: Direction::Descending },
);
});
}
19 changes: 14 additions & 5 deletions czkawka_gui/src/gui_bottom_buttons.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
use gtk::prelude::*;
use gtk::{Bin, Widget};

use crate::gui_popovers::GuiPopovers;
use crate::fl;
use crate::help_functions::get_custom_label_from_button_with_image;

#[derive(Clone)]
pub struct GuiBottomButtons {
pub buttons_search: gtk::Button,
pub buttons_select: gtk::MenuButton,
pub buttons_sort: gtk::MenuButton,
pub buttons_delete: gtk::Button,
pub buttons_save: gtk::Button,
pub buttons_symlink: gtk::Button,
pub buttons_hardlink: gtk::Button,
pub buttons_move: gtk::Button,
pub buttons_show_errors: gtk::Button,
pub buttons_show_upper_notebook: gtk::Button,
pub buttons_names: [String; 7],
pub buttons_array: [Widget; 7],
pub buttons_names: [String; 8],
pub buttons_array: [Widget; 8],
}

impl GuiBottomButtons {
pub fn create_from_builder(builder: &gtk::Builder, popover_select: &gtk::Popover) -> Self {
pub fn create_from_builder(builder: &gtk::Builder, popovers: &GuiPopovers) -> Self {
let buttons_search: gtk::Button = builder.object("buttons_search").unwrap();
let buttons_select: gtk::MenuButton = builder.object("buttons_select").unwrap();
let buttons_sort: gtk::MenuButton = builder.object("buttons_sort").unwrap();
let buttons_delete: gtk::Button = builder.object("buttons_delete").unwrap();
let buttons_save: gtk::Button = builder.object("buttons_save").unwrap();
let buttons_symlink: gtk::Button = builder.object("buttons_symlink").unwrap();
Expand All @@ -40,18 +43,21 @@ impl GuiBottomButtons {
"symlink".to_string(),
"hardlink".to_string(),
"move".to_string(),
"sort".to_string(),
];
let buttons_array: [Widget; 7] = [
let buttons_array: [Widget; 8] = [
buttons_search.clone().upcast::<Widget>(),
buttons_select.clone().upcast::<Widget>(),
buttons_delete.clone().upcast::<Widget>(),
buttons_save.clone().upcast::<Widget>(),
buttons_symlink.clone().upcast::<Widget>(),
buttons_hardlink.clone().upcast::<Widget>(),
buttons_move.clone().upcast::<Widget>(),
buttons_sort.clone().upcast::<Widget>(),
];

buttons_select.set_popover(Some(popover_select));
buttons_select.set_popover(Some(&popovers.popover_select));
buttons_sort.set_popover(Some(&popovers.popover_sort));

Self {
buttons_search,
Expand All @@ -65,6 +71,7 @@ impl GuiBottomButtons {
buttons_show_upper_notebook,
buttons_names,
buttons_array,
buttons_sort,
}
}
pub fn update_language(&self) {
Expand All @@ -75,6 +82,7 @@ impl GuiBottomButtons {
get_custom_label_from_button_with_image(&self.buttons_symlink.clone().upcast::<Bin>()).set_text(&fl!("bottom_symlink_button"));
get_custom_label_from_button_with_image(&self.buttons_hardlink.clone().upcast::<Bin>()).set_text(&fl!("bottom_hardlink_button"));
get_custom_label_from_button_with_image(&self.buttons_move.clone().upcast::<Bin>()).set_text(&fl!("bottom_move_button"));
get_custom_label_from_button_with_image(&self.buttons_sort.clone().upcast::<Bin>()).set_text(&fl!("bottom_sort_button"));

// get_custom_label_from_button_with_image(&self.buttons_search.clone()).set_text(&fl!("bottom_search_button"));
// get_custom_label_from_button_with_image(&self.buttons_select.clone()).set_text(&fl!("bottom_select_button"));
Expand All @@ -86,6 +94,7 @@ impl GuiBottomButtons {

self.buttons_search.set_tooltip_text(Some(&fl!("bottom_search_button_tooltip")));
self.buttons_select.set_tooltip_text(Some(&fl!("bottom_select_button_tooltip")));
self.buttons_sort.set_tooltip_text(Some(&fl!("bottom_sort_button_tooltip")));
self.buttons_delete.set_tooltip_text(Some(&fl!("bottom_delete_button_tooltip")));
self.buttons_save.set_tooltip_text(Some(&fl!("bottom_save_button_tooltip")));
self.buttons_symlink.set_tooltip_text(Some(&fl!("bottom_symlink_button_tooltip")));
Expand Down
2 changes: 1 addition & 1 deletion czkawka_gui/src/gui_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ impl GuiData {
let main_notebook = GuiMainNotebook::create_from_builder(&builder);
let upper_notebook = GuiUpperNotebook::create_from_builder(&builder);
let popovers = GuiPopovers::create_from_builder();
let bottom_buttons = GuiBottomButtons::create_from_builder(&builder, &popovers.popover_select);
let bottom_buttons = GuiBottomButtons::create_from_builder(&builder, &popovers);
let progress_window = GuiProgressDialog::create_from_builder(&window_main);
let about = GuiAbout::create_from_builder(&window_main);
let header = GuiHeader::create_from_builder(&builder);
Expand Down
Loading