Shellmen/src/signal_classes/Controller.py

184 lines
6.9 KiB
Python

# Python imports
import threading, subprocess, traceback
from os.path import isfile
from os import listdir
# Gtk imports
from xdg.DesktopEntry import DesktopEntry
# Application imports
from .mixins import *
from . import Menu, Controller_Data
def threaded(fn):
def wrapper(*args, **kwargs):
threading.Thread(target=fn, args=args, kwargs=kwargs).start()
return wrapper
class Controller(ProcessorMixin, Menu, Controller_Data):
def __init__(self, _settings, args, unknownargs):
super().__init__(_settings, args)
self.setup_controller_data(_settings)
base_options = ["[ TO MAIN MENU ]", "Favorites"]
self.menu_data = self.get_desktop_files_info(self.app_paths)
query = ""
while True:
try:
self.clear_console()
group = self.call_method("main_menu")["group"]
self.clear_console()
if "Search..." in group:
query = self.call_method("search_menu")["query"]
if "[ Set Favorites ]" in group:
programs_list = self.get_sub_group("Search...", "")
fixed_programs_list = []
for program in programs_list:
fixed_programs_list.append({'name': program})
self.favorites = self.call_method("set_favorites_menu", [fixed_programs_list])["set_faves"]
self.settings.save_faves(self.favorites)
continue
if "[ Exit ]" in group:
break
programs_list = ["[ TO MAIN MENU ]"]
programs_list += self.get_sub_group(group, query)
entry = self.call_method("sub_menu", [group, programs_list])["prog"]
if entry not in base_options:
self.execute_program(self.flat_menu_data, entry)
except Exception as e:
self.logger.debug(f"Traceback: {traceback.print_exc()}")
self.logger.debug(f"Exception: {e}")
def get_desktop_files_info(self, paths):
menu_objects = {
"Accessories": {},
"Multimedia": {},
"Graphics": {},
"Game": {},
"Office": {},
"Development": {},
"Internet": {},
"Settings": {},
"System": {},
"Wine": {},
"Other": {}
}
for path in paths:
self.list_and_update_desktop_iles(path, menu_objects);
return menu_objects
def list_and_update_desktop_iles(self, path, menu_objects):
try:
for f in listdir(path):
full_path = f"{path}/{f}"
if isfile(full_path) and f.endswith(".desktop"):
xdg_object = DesktopEntry(full_path)
hidden = xdg_object.getHidden()
nodisplay = xdg_object.getNoDisplay()
type = xdg_object.getType()
groups = xdg_object.getCategories()
# Do not show those marked as hidden or not to display
if hidden or nodisplay:
continue
if type == "Application" and groups != "":
title = xdg_object.getName()
comment = xdg_object.getComment()
# icon = xdg_object.getIcon()
main_exec = xdg_object.getExec()
try_exec = xdg_object.getTryExec()
group = ""
if "Accessories" in groups or "Utility" in groups:
group = "Accessories"
elif "Multimedia" in groups or "Video" in groups or "Audio" in groups:
group = "Multimedia"
elif "Development" in groups:
group = "Development"
elif "Game" in groups:
group = "Game"
elif "Internet" in groups or "Network" in groups:
group = "Internet"
elif "Graphics" in groups:
group = "Graphics"
elif "Office" in groups:
group = "Office"
elif "System" in groups:
group = "System"
elif "Settings" in groups:
group = "Settings"
elif "Wine" in groups:
group = "Wine"
else:
group = "Other"
chunk_data = {
"groups": groups, "comment": comment,
"exec": main_exec, "try_exec": try_exec,
"fileName": f
}
menu_objects[group][title] = chunk_data
self.flat_menu_data[title] = chunk_data
except Exception as e:
self.logger.debug(e)
def get_sub_group(self, group, query = ""):
desktop_objects = []
if "Search..." in group:
for key in self.flat_menu_data.keys():
option = self.flat_menu_data[key]
keys = option.keys()
if "comment" in keys and len(option["comment"]) > 0:
if query.lower() in option["comment"].lower():
desktop_objects.append( f"{key} || {option['comment']}" )
elif query.lower() in key.lower() or query.lower() in option["fileName"].lower():
desktop_objects.append( f"{key} || {option['fileName'].replace('.desktop', '')}" )
elif "Favorites" in group:
desktop_objects = self.favorites
else:
for option in self.menu_data[group]:
keys = option.keys()
if "comment" in keys and len(option["comment"]) > 0 :
desktop_objects.append( f"{option['title']} || {option['comment']}" )
else:
desktop_objects.append( f"{option['title']} || {option['fileName'].replace('.desktop', '')}" )
return desktop_objects
def tear_down(self, widget=None, eve=None):
quit()
def get_clipboard_data(self):
proc = subprocess.Popen(['xclip','-selection', 'clipboard', '-o'], stdout=subprocess.PIPE)
retcode = proc.wait()
data = proc.stdout.read()
return data.decode("utf-8").strip()
def set_clipboard_data(self, data):
proc = subprocess.Popen(['xclip','-selection','clipboard'], stdin=subprocess.PIPE)
proc.stdin.write(data)
proc.stdin.close()
retcode = proc.wait()