From 138053d8d1affeae5d7f19cd1012114890867cc3 Mon Sep 17 00:00:00 2001 From: Emma Nora Theuer Date: Sun, 1 Sep 2024 19:29:04 +0200 Subject: [PATCH] Implement support for a systray --- src/wallman_lib.py | 61 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/src/wallman_lib.py b/src/wallman_lib.py index 4501238..ba3e7ff 100644 --- a/src/wallman_lib.py +++ b/src/wallman_lib.py @@ -4,11 +4,10 @@ from os import chdir, getenv, system import logging import tomllib from datetime import datetime, time -from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.triggers.cron import CronTrigger # setup logging -logger = logging.getLogger(__name__) +logger = logging.getLogger("wallman") class ConfigError(Exception): pass @@ -36,9 +35,24 @@ class _ConfigLib: except KeyError: self.config_notify = False logger.warning("'notify' is not set in dictionary general in the config file, defaulting to 'false'.") + try: + self.config_systray = self.config_general["systray"] + except KeyError: + self.config_systray = True + logger.warning("'systray' is not set in the dictionary general in the config file, defaulting to 'true'.") + + # Setup logging self._set_log_level() + if self.config_systray: + self._initialize_systray() + + def _initialize_systray(self): + try: + import wallman_systray + except (ImportError, FileNotFoundError): + self.config_systray = False def _set_log_level(self): global logging @@ -212,11 +226,38 @@ class WallpaperLogic(_ConfigLib): self._notify_user() return has_wallpaper_been_set - def schedule_wallpapers(self): - scheduler = BlockingScheduler() - # Create a scheduled job for every changing time - for changing_time in range(len(self.config_changing_times)): - clean_time = self._clean_times(changing_time) - scheduler.add_job(self.set_wallpaper_by_time, trigger=CronTrigger(hour=clean_time[0], minute=clean_time[1], second=clean_time[2])) - scheduler.start() - logger.info("The scheduler has been started.") + def run_wallpapers(self): + def _schedule_background_wallpapers(): + from apscheduler.schedulers.background import BackgroundScheduler + scheduler = BackgroundScheduler() + # Create a scheduled job for every changing time + for changing_time in range(len(self.config_changing_times)): + clean_time = self._clean_times(changing_time) + scheduler.add_job(self.set_wallpaper_by_time, trigger=CronTrigger(hour=clean_time[0], minute=clean_time[1], second=clean_time[2])) + scheduler.start() + logger.info("The background scheduler has been started.") + return scheduler + + def _schedule_blocking_wallpapers(): + from apscheduler.schedulers.blocking import BlockingScheduler + scheduler = BlockingScheduler() + # Create a scheduled job for every changing time + for changing_time in range(len(self.config_changing_times)): + clean_time = self._clean_times(changing_time) + scheduler.add_job(self.set_wallpaper_by_time, trigger=CronTrigger(hour=clean_time[0], minute=clean_time[1], second=clean_time[2])) + scheduler.start() + logger.info("The blocking scheduler has been started.") + + if self.config_systray: + import wallman_systray as systray + from functools import partial + scheduler = _schedule_background_wallpapers() + menu = systray.Menu ( + systray.item("Re-Set Wallpaper", partial(systray.set_wallpaper_again, callback=self.set_wallpaper_by_time)), + systray.item("Reroll Wallpapers", partial(systray.reroll_wallpapers, first_callback=self._choose_wallpaper_set, second_callback=self.set_wallpaper_by_time)), + systray.item("Quit", partial(systray.on_quit, callback=scheduler.shutdown)) + ) + icon =systray.Icon("wallman_icon", systray.icon_image, "My Tray Icon", menu) + icon.run() + else: + _schedule_blocking_wallpapers()