overhaul selection functions

This commit is contained in:
joshuaboud 2021-07-20 14:23:49 -03:00
parent 1526d09b5d
commit d52354fac5
No known key found for this signature in database
GPG Key ID: 17EFB59E2A8BF50E
3 changed files with 112 additions and 70 deletions

View File

@ -213,6 +213,18 @@ export class NavDir extends NavEntry {
}
super.show_properties(extra_properties);
}
style_selected() {
this.dom_element.nav_item_icon.classList.remove("fa-folder");
this.dom_element.nav_item_icon.classList.add("fa-folder-open");
super.style_selected();
}
unstyle_selected() {
this.dom_element.nav_item_icon.classList.add("fa-folder");
this.dom_element.nav_item_icon.classList.remove("fa-folder-open");
super.unstyle_selected();
}
}
export class NavDirLink extends NavDir{

View File

@ -374,4 +374,12 @@ export class NavEntry {
document.getElementById("nav-edit-owner").value = this.stat["owner"];
document.getElementById("nav-edit-group").value = this.stat["group"];
}
style_selected() {
this.dom_element.classList.add("nav-item-selected");
}
unstyle_selected() {
this.dom_element.classList.remove("nav-item-selected");
}
}

View File

@ -38,7 +38,6 @@ export class NavWindow {
this.window.addEventListener("click", this);
this.window.addEventListener("contextmenu", this);
window.addEventListener("keydown", this);
this.last_selected_index = -1;
this.context_menu = new NavContextMenu("nav-context-menu", this);
@ -56,11 +55,11 @@ export class NavWindow {
* @param {Event} e
*/
handleEvent(e) {
console.log(e);
e.stopPropagation();
switch (e.type) {
case "click":
if (e.target === this.window) {
this.clear_selected();
this.reset_selection();
this.show_selected_properties();
}
break;
@ -75,7 +74,7 @@ export class NavWindow {
this.select_all();
e.preventDefault();
} else if (e.keyCode === 27) {
this.clear_selected();
this.reset_selection();
} else if (e.keyCode === 67 && e.ctrlKey) {
this.copy();
} else if (e.keyCode === 86 && e.ctrlKey) {
@ -132,7 +131,7 @@ export class NavWindow {
file.context_menu_ref = this.context_menu;
});
document.getElementById("pwd").value = this.pwd().path_str();
this.set_selected(this.pwd(), false, false);
this.reset_selection();
this.show_selected_properties();
document.getElementById("nav-num-dirs").innerText = `${num_dirs} Director${(num_dirs === 1)? "y" : "ies"}`;
document.getElementById("nav-num-files").innerText = `${num_files} File${(num_files === 1)? "" : "s"}`;
@ -181,66 +180,84 @@ export class NavWindow {
this.cd(new NavDir(this.pwd().parent_dir()));
}
clear_selected() {
for (let entry of this.selected_entries) {
entry.unstyle_selected();
}
this.selected_entries.clear();
}
/**
*
* @param {NavEntry} entry
* @param {Boolean} select_range
* @param {Boolean} append
*/
set_selected(entry, select_range, append) {
this.hide_edit_selected();
for (let i of this.selected_entries) {
i.dom_element.classList.remove("nav-item-selected");
if (i.nav_type === "dir") {
i.dom_element.nav_item_icon.classList.remove("fa-folder-open");
i.dom_element.nav_item_icon.classList.add("fa-folder");
}
}
var to_be_selected = [];
if (append && this.selected_entries.has(entry)) {
this.selected_entries.delete(entry);
if (this.selected_entries.size === 0) {
this.clear_selected();
}
} else if (select_range && this.last_selected_index !== -1) {
var start = this.last_selected_index;
var end = this.entries.indexOf(entry);
if (end < start)
[start, end] = [end, start];
if (end === -1)
return;
to_be_selected = this.entries.slice(start, end + 1).filter(entry => !entry.stat["inaccessible"]);
} else {
if (!append)
this.selected_entries.clear();
to_be_selected = [entry];
}
to_be_selected = to_be_selected.filter((entry) => entry.visible);
for (let i of to_be_selected) {
this.selected_entries.add(i);
}
for (let i of this.selected_entries) {
i.dom_element.classList.add("nav-item-selected");
if (i.nav_type === "dir") {
i.dom_element.nav_item_icon.classList.remove("fa-folder");
i.dom_element.nav_item_icon.classList.add("fa-folder-open");
}
}
if (this.selected_entries.size > 1){
var name_fields = document.getElementsByClassName("nav-info-column-filename");
for (let name_field of name_fields) {
name_field.innerText = this.selected_entries.size.toString() + " selected"
name_field.title = name_field.innerText;
}
document.getElementById("nav-info-column-properties").innerHTML = "";
} else {
this.show_selected_properties();
}
this.last_selected_index = this.entries.indexOf(entry);
select_one(entry) {
entry.style_selected();
this.selected_entries.add(entry);
}
clear_selected() {
this.set_selected(this.pwd(), false, false);
deselect_one(entry) {
entry.unstyle_selected();
this.selected_entries.delete(entry);
}
/**
*
* @param {NavEntry} start
* @param {NavEntry} end
*/
select_range(start, end) {
let start_ind = this.entries.indexOf(start);
let end_ind = this.entries.indexOf(end);
if (start_ind === -1 || end_ind === -1)
return;
if (end_ind === start_ind)
this.select_one(start);
else if (end_ind < start_ind)
[start_ind, end_ind] = [end_ind, start_ind];
for (let i = start_ind; i <= end_ind; i++) {
let entry = this.entries[i];
if (entry.visible && (!entry.is_hidden_file || this.show_hidden))
this.select_one(entry);
}
}
reset_selection() {
this.clear_selected();
this.select_one(this.pwd());
this.last_selected_entry = null;
this.update_selection_info();
}
/**
*
* @param {NavEntry} target
* @param {Boolean} shift
* @param {Boolean} ctrl
*/
set_selected(target, shift, ctrl) {
if (!ctrl && !shift)
this.clear_selected();
if (!shift || !this.last_selected_entry)
this.last_selected_entry = target;
if (shift) {
if (!ctrl)
this.clear_selected();
this.select_range(
this.last_selected_entry ?? this.entries[0],
target
);
} else if (ctrl && this.selected_entries.has(target)) {
this.deselect_one(target)
} else {
this.select_one(target);
}
this.update_selection_info();
}
select_all() {
this.select_range(this.entries[0], this.entries[this.entries.length - 1]);
this.update_selection_info();
}
selected_entry() {
@ -255,6 +272,20 @@ export class NavWindow {
this.selected_entry()?.show_properties?.();
}
update_selection_info() {
if (this.selected_entries.size > 1){
var name_fields = document.getElementsByClassName("nav-info-column-filename");
for (let name_field of name_fields) {
name_field.innerText = this.selected_entries.size.toString() + " selected"
name_field.title = name_field.innerText;
}
document.getElementById("nav-info-column-properties").innerHTML = "";
} else {
console.log("Single selected");
this.show_selected_properties();
}
}
async show_edit_selected() {
var dangerous_dirs = [
"/",
@ -808,15 +839,6 @@ export class NavWindow {
this.set_nav_button_state();
}
select_all() {
this.selected_entries.clear();
for (let entry of this.entries) {
if (!entry.is_hidden_file || this.show_hidden) {
this.set_selected(entry, false, true);
}
}
}
async switch_item_display() {
var button = document.getElementById("nav-item-display-icon");
if (this.item_display === "grid") {