WIP new structure
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
"""
|
||||
Utils module
|
||||
"""
|
||||
@@ -1,22 +0,0 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
|
||||
class EndpointRegistry():
|
||||
def __init__(self):
|
||||
self._endpoints = {}
|
||||
|
||||
def register(self, rule, **options):
|
||||
def decorator(f):
|
||||
self._endpoints[rule] = f
|
||||
return f
|
||||
|
||||
return decorator
|
||||
|
||||
def get_endpoints(self):
|
||||
return self._endpoints
|
||||
@@ -1,30 +0,0 @@
|
||||
# Python imports
|
||||
from collections import defaultdict
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
|
||||
class EventSystem:
|
||||
""" Create event system. """
|
||||
|
||||
def __init__(self):
|
||||
self.subscribers = defaultdict(list)
|
||||
|
||||
|
||||
def subscribe(self, event_type, fn):
|
||||
self.subscribers[event_type].append(fn)
|
||||
|
||||
def emit(self, event_type, data = None):
|
||||
if event_type in self.subscribers:
|
||||
for fn in self.subscribers[event_type]:
|
||||
if data:
|
||||
if hasattr(data, '__iter__') and not type(data) is str:
|
||||
fn(*data)
|
||||
else:
|
||||
fn(data)
|
||||
else:
|
||||
fn()
|
||||
@@ -1,56 +0,0 @@
|
||||
# Python imports
|
||||
import os, logging
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
class Logger:
|
||||
"""
|
||||
Create a new logging object and return it.
|
||||
:note:
|
||||
NOSET # Don't know the actual log level of this... (defaulting or literally none?)
|
||||
Log Levels (From least to most)
|
||||
Type Value
|
||||
CRITICAL 50
|
||||
ERROR 40
|
||||
WARNING 30
|
||||
INFO 20
|
||||
DEBUG 10
|
||||
:param loggerName: Sets the name of the logger object. (Used in log lines)
|
||||
:param createFile: Whether we create a log file or just pump to terminal
|
||||
|
||||
:return: the logging object we created
|
||||
"""
|
||||
|
||||
def __init__(self, config_path: str, _ch_log_lvl = logging.CRITICAL, _fh_log_lvl = logging.INFO):
|
||||
self._CONFIG_PATH = config_path
|
||||
self.global_lvl = logging.DEBUG # Keep this at highest so that handlers can filter to their desired levels
|
||||
self.ch_log_lvl = _ch_log_lvl # Prety much the only one we ever change
|
||||
self.fh_log_lvl = _fh_log_lvl
|
||||
|
||||
def get_logger(self, loggerName: str = "NO_LOGGER_NAME_PASSED", createFile: bool = True) -> logging.Logger:
|
||||
log = logging.getLogger(loggerName)
|
||||
log.setLevel(self.global_lvl)
|
||||
|
||||
# Set our log output styles
|
||||
fFormatter = logging.Formatter('[%(asctime)s] %(pathname)s:%(lineno)d %(levelname)s - %(message)s', '%m-%d %H:%M:%S')
|
||||
cFormatter = logging.Formatter('%(pathname)s:%(lineno)d] %(levelname)s - %(message)s')
|
||||
|
||||
ch = logging.StreamHandler()
|
||||
ch.setLevel(level=self.ch_log_lvl)
|
||||
ch.setFormatter(cFormatter)
|
||||
log.addHandler(ch)
|
||||
|
||||
if createFile:
|
||||
folder = self._CONFIG_PATH
|
||||
file = f"{folder}/application.log"
|
||||
|
||||
if not os.path.exists(folder):
|
||||
os.mkdir(folder)
|
||||
|
||||
fh = logging.FileHandler(file)
|
||||
fh.setLevel(level=self.fh_log_lvl)
|
||||
fh.setFormatter(fFormatter)
|
||||
log.addHandler(fh)
|
||||
|
||||
return log
|
||||
@@ -1,91 +0,0 @@
|
||||
# Python imports
|
||||
import os
|
||||
|
||||
# Lib imports
|
||||
import gi, cairo
|
||||
gi.require_version('Gtk', '3.0')
|
||||
gi.require_version('Gdk', '3.0')
|
||||
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
|
||||
|
||||
# Application imports
|
||||
from .logger import Logger
|
||||
|
||||
|
||||
|
||||
|
||||
class Settings:
|
||||
def __init__(self):
|
||||
self._SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__))
|
||||
self._USER_HOME = os.path.expanduser('~')
|
||||
self._CONFIG_PATH = f"{self._USER_HOME}/.config/{app_name.lower()}"
|
||||
self._GLADE_FILE = f"{self._CONFIG_PATH}/Main_Window.glade"
|
||||
self._CSS_FILE = f"{self._CONFIG_PATH}/stylesheet.css"
|
||||
self._DEFAULT_ICONS = f"{self._CONFIG_PATH}/icons"
|
||||
self._WINDOW_ICON = f"{self._DEFAULT_ICONS}/{app_name.lower()}.png"
|
||||
self._USR_PATH = f"/usr/share/{app_name.lower()}"
|
||||
self._SCREENSHOTS_DIR = f"{self._USER_HOME}/.screenshots"
|
||||
|
||||
if not os.path.exists(self._CONFIG_PATH):
|
||||
os.mkdir(self._CONFIG_PATH)
|
||||
if not os.path.exists(self._GLADE_FILE):
|
||||
self._GLADE_FILE = f"{self._USR_PATH}/Main_Window.glade"
|
||||
if not os.path.exists(self._CSS_FILE):
|
||||
self._CSS_FILE = f"{self._USR_PATH}/stylesheet.css"
|
||||
if not os.path.exists(self._WINDOW_ICON):
|
||||
self._WINDOW_ICON = f"{self._USR_PATH}/icons/{app_name.lower()}.png"
|
||||
if not os.path.isdir(self._SCREENSHOTS_DIR):
|
||||
os.mkdir(self._SCREENSHOTS_DIR)
|
||||
|
||||
# 'Filters'
|
||||
self._images = ('.png', '.jpg', '.jpeg', '.gif')
|
||||
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
self._logger = Logger(self._CONFIG_PATH, _fh_log_lvl=20).get_logger()
|
||||
|
||||
def create_window(self):
|
||||
# Get window and connect signals
|
||||
window = self._builder.get_object("Main_Window")
|
||||
window.connect("delete-event", Gtk.main_quit)
|
||||
self.set_window_data(window)
|
||||
return window
|
||||
|
||||
def set_window_data(self, window):
|
||||
screen = window.get_screen()
|
||||
visual = screen.get_rgba_visual()
|
||||
|
||||
if visual != None and screen.is_composited():
|
||||
window.set_visual(visual)
|
||||
|
||||
# bind css file
|
||||
css_provider = Gtk.CssProvider()
|
||||
css_provider.load_from_path(self._CSS_FILE)
|
||||
screen = Gdk.Screen.get_default()
|
||||
style_context = Gtk.StyleContext()
|
||||
style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)
|
||||
|
||||
def get_monitor_data(self):
|
||||
screen = self._builder.get_object("Main_Window").get_screen()
|
||||
wdth = screen.get_width()
|
||||
hght = screen.get_height()
|
||||
mon0 = Gdk.Rectangle()
|
||||
mon0.width = wdth
|
||||
mon0.height = hght
|
||||
monitors = []
|
||||
|
||||
monitors.append(mon0)
|
||||
for m in range(screen.get_n_monitors()):
|
||||
monitors.append(screen.get_monitor_geometry(m))
|
||||
|
||||
return monitors
|
||||
|
||||
|
||||
def get_builder(self) -> Gtk.Builder: return self._builder
|
||||
def get_logger(self) -> Logger: return self._logger
|
||||
def get_screenshots_dir(self) -> str: return self._SCREENSHOTS_DIR
|
||||
|
||||
# Filter returns
|
||||
def get_images_filter(self): return self._images
|
||||
@@ -1,89 +0,0 @@
|
||||
# Python imports
|
||||
import os, time, datetime
|
||||
|
||||
# Lib imports
|
||||
from gi.repository import GLib
|
||||
import pyscreenshot as capture
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
|
||||
class Utils:
|
||||
def __init__(self):
|
||||
self.builder = settings.get_builder()
|
||||
|
||||
self.SCREENSHOTS_DIR = settings.get_screenshots_dir()
|
||||
self.file_store = self.builder.get_object("fileStore")
|
||||
self.refreshing_state = False
|
||||
|
||||
|
||||
def get_refreshing_state(self):
|
||||
return self.refreshing_state
|
||||
|
||||
def set_refreshing_state(self, state):
|
||||
self.refreshing_state = state
|
||||
|
||||
|
||||
@threaded
|
||||
def referesh_directory_list(self):
|
||||
self.refreshing_state = True
|
||||
|
||||
images = self.get_directory_list()
|
||||
images.sort()
|
||||
if len(images) != len(self.file_store):
|
||||
self.file_store.clear()
|
||||
for image in images:
|
||||
GLib.idle_add(self.add_to_store, (image))
|
||||
|
||||
self.refreshing_state = False
|
||||
|
||||
|
||||
def add_to_store(self, image):
|
||||
self.file_store.append([image])
|
||||
|
||||
def get_directory_list(self):
|
||||
files = []
|
||||
|
||||
for file in os.listdir(self.SCREENSHOTS_DIR):
|
||||
if os.path.isfile(os.path.join(self.SCREENSHOTS_DIR, file)):
|
||||
files.append(file)
|
||||
|
||||
return files
|
||||
|
||||
|
||||
def do_bounding_box_grab(self, x1, y1, x2, y2):
|
||||
# childprocess=False needed to not crash program
|
||||
im = capture.grab(bbox=(x1, y1, x2, y2), childprocess=False)
|
||||
im.save(self.generate_screenshot_name())
|
||||
|
||||
def generate_screenshot_name(self):
|
||||
return f"{self.SCREENSHOTS_DIR}/scrshot_{self.get_time()}.png"
|
||||
|
||||
def get_time(self):
|
||||
now = datetime.datetime.now()
|
||||
return now.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
def sleep(self, wait=None):
|
||||
delay_amount = self.builder.get_object("delayAmount")
|
||||
if not wait:
|
||||
wait = delay_amount.get_value_as_int()
|
||||
|
||||
time.sleep(wait)
|
||||
|
||||
|
||||
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()
|
||||
|
||||
def close(self, widget):
|
||||
gtk.main_quit()
|
||||
Reference in New Issue
Block a user