ShellFM/src/shellfm/windows/tabs/tab.py

291 lines
8.3 KiB
Python

# Python imports
import os
import hashlib
import re
from os import listdir
from os.path import isdir
from os.path import isfile
from os.path import join
from random import randint
# Lib imports
# Application imports
from .utils.settings import Settings
from .utils.launcher import Launcher
from .utils.filehandler import FileHandler
from .icons.icon import Icon
from .path import Path
try:
get_file_size("/")
except Exception as e:
import os
def sizeof_fmt_def(num, suffix="B"):
for unit in ["", "K", "M", "G", "T", "Pi", "Ei", "Zi"]:
if abs(num) < 1024.0:
return f"{num:3.1f} {unit}{suffix}"
num /= 1024.0
return f"{num:.1f} Yi{suffix}"
def _get_file_size(file):
return "4K" if isdir(file) else sizeof_fmt_def(os.path.getsize(file))
get_file_size = _get_file_size
class Tab(Settings, FileHandler, Launcher, Icon, Path):
def __init__(self):
self.logger = None
self._id_length: int = 10
self._id: str = ""
self._wid: str = None
self.error_message: str = None
self._dir_watcher = None
self._hide_hidden: bool = self.HIDE_HIDDEN_FILES
self._files: list = []
self._dirs: list = []
self._videos: list = []
self._images: list = []
self._desktops: list = []
self._ungrouped: list = []
self._hidden: list = []
self._generate_id()
self.set_to_home()
def load_directory(self) -> None:
path = self.get_path()
self._dirs = []
self._videos = []
self._images = []
self._desktops = []
self._ungrouped = []
self._hidden = []
self._files = []
if not isdir(path):
self._set_error_message("Path can not be accessed.")
self.set_to_home()
return ""
for f in listdir(path):
file = join(path, f)
# content = {"name": f, hash: self._hash_text(f)}
content = f
if self._hide_hidden:
if f.startswith('.'):
self._hidden.append(content)
continue
if isfile(file):
lowerName = file.lower()
if lowerName.endswith(self.fvideos):
self._videos.append(content)
elif lowerName.endswith(self.fimages):
self._images.append(content)
elif lowerName.endswith((".desktop",)):
self._desktops.append(content)
else:
self._ungrouped.append(content)
else:
self._dirs.append(content)
self._dirs.sort(key = self._natural_keys)
self._videos.sort(key = self._natural_keys)
self._images.sort(key = self._natural_keys)
self._desktops.sort(key = self._natural_keys)
self._ungrouped.sort(key = self._natural_keys)
self._files = self._dirs + self._videos + self._images + self._desktops + self._ungrouped
def is_folder_locked(self, hash):
if self.lock_folder:
path_parts = self.get_path().split('/')
file = self.get_path_part_from_hash(hash)
# Insure chilren folders are locked too.
lockedFolderInPath = False
for folder in self.locked_folders:
if folder in path_parts:
lockedFolderInPath = True
break
return (file in self.locked_folders or lockedFolderInPath)
else:
return False
def get_not_hidden_count(self) -> int:
return len(self._files) + \
len(self._dirs) + \
len(self._videos) + \
len(self._images) + \
len(self._desktops) + \
len(self._ungrouped)
def get_hidden_count(self) -> int:
return len(self._hidden)
def get_files_count(self) -> int:
return len(self._files)
def get_path_part_from_hash(self, hash: str) -> str:
files = self.get_files()
file = None
for f in files:
if hash == f[1]:
file = f[0]
break
return file
def get_files_formatted(self) -> dict:
files = self._hash_set(self._files),
dirs = self._hash_set(self._dirs),
videos = self.get_videos(),
images = self._hash_set(self._images),
desktops = self._hash_set(self._desktops),
ungrouped = self._hash_set(self._ungrouped)
hidden = self._hash_set(self._hidden)
return {
'path_head': self.get_path(),
'list': {
'files': files,
'dirs': dirs,
'videos': videos,
'images': images,
'desktops': desktops,
'ungrouped': ungrouped,
'hidden': hidden
}
}
def get_video_icons(self) -> list:
data = []
dir = self.get_current_directory()
for file in self._videos:
img_hash, hash_img_path = self.create_video_thumbnail(full_path=f"{dir}/{file}", returnHashInstead=True)
data.append([img_hash, hash_img_path])
return data
def get_pixbuf_icon_str_combo(self):
data = []
dir = self.get_current_directory()
for file in self._files:
icon = self.create_icon(dir, file).get_pixbuf()
data.append([icon, file])
return data
def get_gtk_icon_str_combo(self) -> list:
data = []
dir = self.get_current_directory()
for file in self._files:
icon = self.create_icon(dir, file)
data.append([icon, file[0]])
return data
def get_current_directory(self) -> str:
return self.get_path()
def get_current_sub_path(self) -> str:
path = self.get_path()
home = f"{self.get_home()}/"
return path.replace(home, "")
def get_end_of_path(self) -> str:
parts = self.get_current_directory().split("/")
size = len(parts)
return parts[size - 1]
def set_hiding_hidden(self, state: bool) -> None:
self._hide_hidden = state
def is_hiding_hidden(self) -> bool:
return self._hide_hidden
def get_dot_dots(self) -> list:
return self._hash_set(['.', '..'])
def get_files(self) -> list:
return self._hash_set(self._files)
def get_dirs(self) -> list:
return self._hash_set(self._dirs)
def get_videos(self) -> list:
return self._hash_set(self._videos)
def get_images(self) -> list:
return self._hash_set(self._images)
def get_desktopss(self) -> list:
return self._hash_set(self._desktops)
def get_ungrouped(self) -> list:
return self._hash_set(self._ungrouped)
def get_hidden(self) -> list:
return self._hash_set(self._hidden)
def get_id(self) -> str:
return self._id
def set_wid(self, _wid: str) -> None:
self._wid = _wid
def get_wid(self) -> str:
return self._wid
def set_dir_watcher(self, watcher):
self._dir_watcher = watcher
def get_dir_watcher(self):
return self._dir_watcher
def get_error_message(self):
return self.error_message
def unset_error_message(self):
self.error_message = None
def _atoi(self, text):
return int(text) if text.isdigit() else text
def _natural_keys(self, text):
return [ self._atoi(c) for c in re.split('(\d+)',text) ]
def _hash_text(self, text) -> str:
return hashlib.sha256(str.encode(text)).hexdigest()[:18]
def _hash_set(self, arry: list) -> list:
path = self.get_current_directory()
data = []
for arr in arry:
file = f"{path}/{arr}"
size = get_file_size(file)
data.append([arr, self._hash_text(arr), size])
return data
def _random_with_N_digits(self, n: int) -> int:
range_start = 10**(n-1)
range_end = (10**n)-1
return randint(range_start, range_end)
def _generate_id(self) -> str:
self._id = str(self._random_with_N_digits(self._id_length))
def _set_error_message(self, text: str):
self.error_message = text