Shellmen/src/core/widgets/desktop_files.py

147 lines
4.5 KiB
Python

# Python imports
import pickle
from os import listdir
from dataclasses import fields
# Lib imports
from xdg.DesktopEntry import DesktopEntry
# Application imports
class DdesktopFiles:
def __init__(self):
self.application_dirs = settings.config.application_dirs
self.desktop_enteries = []
self.groups = {}
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self.reload_desktop_entries()
self.create_groups_mapping()
def _setup_styling(self):
...
def _setup_signals(self):
...
def _subscribe_to_events(self):
event_system.subscribe("reload_desktop_entries", self.reload_desktop_entries)
event_system.subscribe("get_desktop_entries", self.get_desktop_entries)
event_system.subscribe("get_search_results", self.get_search_results)
event_system.subscribe("get_favorites_results", self.get_favorites_results)
event_system.subscribe("get_sub_group", self.get_sub_group)
def reload_desktop_entries(self):
self.desktop_enteries.clear()
self.desktop_enteries = None
self.desktop_enteries = []
self.collect_desktop_entries()
self.groups = None
self.groups = {}
self.create_groups_mapping()
def collect_desktop_entries(self):
for path in self.application_dirs:
for f in listdir(path):
if f.endswith(".desktop"):
self.create_desktop_entry(f"{path}/{f}")
def create_desktop_entry(self, path):
xdg_object = DesktopEntry(path)
if xdg_object.getHidden() or xdg_object.getNoDisplay():
return
type = xdg_object.getType()
if type == "Application":
self.desktop_enteries.append(xdg_object)
def create_groups_mapping(self):
self.create_default_groups()
self.generation_primary_group_mapping()
self.cross_append_groups()
def create_default_groups(self):
for slot in settings.filters.__slots__:
self.groups[slot.title()] = []
def generation_primary_group_mapping(self):
for entry in self.desktop_enteries:
groups = entry.getCategories()
if not groups:
self.groups["Other"].append(entry)
for group in groups:
if not group in self.groups.keys():
self.groups[group] = []
self.groups[group].append(entry)
def cross_append_groups(self):
fields_data = fields(settings.filters)
for field in fields_data:
title = field.name.title()
to_merge = []
for group in field.default_factory():
to_merge += self.groups[group]
sub_map = {}
# NOTE: Will "hash" filters ("to_merge" var) first so that target self.groups[title] overrites with its own if any entry exists.
for entry in to_merge + self.groups[title]:
s1 = pickle.dumps(entry)
str_version = s1.decode('unicode_escape')
sub_map[str_version] = entry
merged_set = []
for key in sub_map.keys():
merged_set.append(sub_map[key])
self.groups[title] = merged_set
def get_desktop_entries(self) -> []:
return self.desktop_enteries
def get_favorites_results(self, group):
results = []
for entry in self.desktop_enteries:
_entry = f"{entry.getName()} || {entry.getComment()}"
if _entry in settings.favorites["apps"]:
try_exec = entry.getTryExec()
main_exec = entry.getExec()
results.append( [_entry, f" {try_exec} || {main_exec}"] )
return results
def get_search_results(self, query):
logger.debug(f"Search Query: {query}")
results = []
for entry in self.desktop_enteries:
title = entry.getName()
comment = entry.getComment()
if query in title.lower() or query in comment.lower():
try_exec = entry.getTryExec()
main_exec = entry.getExec()
results.append( [f"{title} || {comment}", f" {try_exec} || {main_exec}"] )
return results
def get_sub_group(self, group):
results = []
for entry in self.groups[group]:
results.append( [f"{entry.getName()} || {entry.getComment()}", f" {entry.getTryExec()} || {entry.getExec()}"] )
return results