From 953e1db6f14a24bbd1f880db76ae31e2c2ba1e3e Mon Sep 17 00:00:00 2001 From: "dries.k" Date: Sun, 4 Dec 2022 19:55:31 +0100 Subject: [PATCH] add option to clear the image cache --- gotify_tray/database/cache.py | 3 ++ gotify_tray/gui/designs/widget_settings.py | 28 ++++++++++++-- gotify_tray/gui/designs/widget_settings.ui | 43 ++++++++++++++++++++++ gotify_tray/gui/widgets/SettingsDialog.py | 18 ++++++++- gotify_tray/tasks.py | 21 ++++++++++- 5 files changed, 106 insertions(+), 7 deletions(-) diff --git a/gotify_tray/database/cache.py b/gotify_tray/database/cache.py index e7ebcd5..ac62dac 100644 --- a/gotify_tray/database/cache.py +++ b/gotify_tray/database/cache.py @@ -32,6 +32,9 @@ class Cache(object): self.cache_dir = os.path.join(path, "cache") os.makedirs(self.cache_dir, exist_ok=True) + def directory(self) -> str: + return self.cache_dir + def clear(self): self.cursor.execute("DELETE FROM cache") self.database.commit() diff --git a/gotify_tray/gui/designs/widget_settings.py b/gotify_tray/gui/designs/widget_settings.py index 31df766..97e7ac8 100644 --- a/gotify_tray/gui/designs/widget_settings.py +++ b/gotify_tray/gui/designs/widget_settings.py @@ -171,6 +171,22 @@ class Ui_Dialog(object): self.horizontalLayout_4.addItem(spacerItem5) self.gridLayout_2.addLayout(self.horizontalLayout_4, 0, 0, 1, 1) self.verticalLayout.addWidget(self.groupbox_image_popup) + self.groupBox_cache = QtWidgets.QGroupBox(self.tab_advanced) + self.groupBox_cache.setObjectName("groupBox_cache") + self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.groupBox_cache) + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.pb_clear_cache = QtWidgets.QPushButton(self.groupBox_cache) + self.pb_clear_cache.setObjectName("pb_clear_cache") + self.horizontalLayout_6.addWidget(self.pb_clear_cache) + self.pb_open_cache_dir = QtWidgets.QPushButton(self.groupBox_cache) + self.pb_open_cache_dir.setObjectName("pb_open_cache_dir") + self.horizontalLayout_6.addWidget(self.pb_open_cache_dir) + self.label_cache = QtWidgets.QLabel(self.groupBox_cache) + self.label_cache.setObjectName("label_cache") + self.horizontalLayout_6.addWidget(self.label_cache) + spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_6.addItem(spacerItem6) + self.verticalLayout.addWidget(self.groupBox_cache) self.groupBox_logging = QtWidgets.QGroupBox(self.tab_advanced) self.groupBox_logging.setObjectName("groupBox_logging") self.gridLayout_6 = QtWidgets.QGridLayout(self.groupBox_logging) @@ -178,8 +194,8 @@ class Ui_Dialog(object): self.combo_logging = QtWidgets.QComboBox(self.groupBox_logging) self.combo_logging.setObjectName("combo_logging") self.gridLayout_6.addWidget(self.combo_logging, 0, 1, 1, 1) - spacerItem6 = QtWidgets.QSpacerItem(190, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.gridLayout_6.addItem(spacerItem6, 0, 3, 1, 1) + spacerItem7 = QtWidgets.QSpacerItem(190, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_6.addItem(spacerItem7, 0, 3, 1, 1) self.pb_open_log = QtWidgets.QPushButton(self.groupBox_logging) self.pb_open_log.setMaximumSize(QtCore.QSize(30, 16777215)) self.pb_open_log.setObjectName("pb_open_log") @@ -188,8 +204,8 @@ class Ui_Dialog(object): self.label_logging.setObjectName("label_logging") self.gridLayout_6.addWidget(self.label_logging, 0, 0, 1, 1) self.verticalLayout.addWidget(self.groupBox_logging) - spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.verticalLayout.addItem(spacerItem7) + spacerItem8 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem8) self.tabWidget.addTab(self.tab_advanced, "") self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) @@ -238,6 +254,10 @@ class Ui_Dialog(object): self.label_2.setToolTip(_translate("Dialog", "Maximum pop-up height")) self.label_2.setText(_translate("Dialog", "Height")) self.spin_popup_h.setToolTip(_translate("Dialog", "Maximum pop-up height")) + self.groupBox_cache.setTitle(_translate("Dialog", "Cache")) + self.pb_clear_cache.setText(_translate("Dialog", "Clear")) + self.pb_open_cache_dir.setText(_translate("Dialog", "Open")) + self.label_cache.setText(_translate("Dialog", "TextLabel")) self.groupBox_logging.setTitle(_translate("Dialog", "Logging")) self.pb_open_log.setToolTip(_translate("Dialog", "Open logfile")) self.pb_open_log.setText(_translate("Dialog", "...")) diff --git a/gotify_tray/gui/designs/widget_settings.ui b/gotify_tray/gui/designs/widget_settings.ui index 5660f81..fc75ed8 100644 --- a/gotify_tray/gui/designs/widget_settings.ui +++ b/gotify_tray/gui/designs/widget_settings.ui @@ -400,6 +400,49 @@ + + + + Cache + + + + + + Clear + + + + + + + Open + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + diff --git a/gotify_tray/gui/widgets/SettingsDialog.py b/gotify_tray/gui/widgets/SettingsDialog.py index 19b0f69..c37171f 100644 --- a/gotify_tray/gui/widgets/SettingsDialog.py +++ b/gotify_tray/gui/widgets/SettingsDialog.py @@ -2,12 +2,12 @@ import logging import platform import os -from gotify_tray.database import Settings +from gotify_tray.database import Cache, Settings from gotify_tray.gotify import GotifyMessageModel from gotify_tray.gui.models import MessagesModelItem from . import MessageWidget from gotify_tray.utils import get_icon, verify_server, open_file -from gotify_tray.tasks import ExportSettingsTask, ImportSettingsTask +from gotify_tray.tasks import ExportSettingsTask, ImportSettingsTask, CacheSizeTask, ClearCacheTask from gotify_tray.gui.themes import get_themes from PyQt6 import QtCore, QtGui, QtWidgets @@ -91,6 +91,8 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): ) self.spin_popup_w.setValue(settings.value("ImagePopup/w", type=int)) self.spin_popup_h.setValue(settings.value("ImagePopup/h", type=int)) + self.label_cache.setText("0 MB") + self.compute_cache_size() def add_message_widget(self): self.message_widget = MessageWidget( @@ -108,6 +110,11 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): ) self.layout_fonts_message.addWidget(self.message_widget) + def compute_cache_size(self): + self.cache_size_task = CacheSizeTask() + self.cache_size_task.size.connect(lambda size: self.label_cache.setText(f"{round(size/1e6, 1)} MB")) + self.cache_size_task.start() + def change_server_info_callback(self): self.server_changed = verify_server(force_new=True, enable_import=False) @@ -180,6 +187,11 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): settings.clear() self.quit_requested.emit() + def clear_cache_callback(self): + self.clear_cache_task = ClearCacheTask() + self.clear_cache_task.start() + self.label_cache.setText("0 MB") + def link_callbacks(self): self.buttonBox.button( QtWidgets.QDialogButtonBox.StandardButton.Apply @@ -224,6 +236,8 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): self.groupbox_image_popup.toggled.connect(self.settings_changed_callback) self.spin_popup_w.valueChanged.connect(self.settings_changed_callback) self.spin_popup_h.valueChanged.connect(self.settings_changed_callback) + self.pb_clear_cache.clicked.connect(self.clear_cache_callback) + self.pb_open_cache_dir.clicked.connect(lambda: open_file(Cache().directory())) def apply_settings(self): # Priority diff --git a/gotify_tray/tasks.py b/gotify_tray/tasks.py index 6593588..d9e0233 100644 --- a/gotify_tray/tasks.py +++ b/gotify_tray/tasks.py @@ -1,11 +1,14 @@ import abc +import glob import logging import time +import os +from functools import reduce from PyQt6 import QtCore from PyQt6.QtCore import pyqtSignal -from gotify_tray.database import Downloader, Settings +from gotify_tray.database import Cache, Downloader, Settings from gotify_tray.gotify.api import GotifyClient from gotify_tray.gotify.models import GotifyVersionModel from gotify_tray.utils import get_image @@ -229,3 +232,19 @@ class ProcessMessagesTask(BaseTask): # Prevent locking up the UI when there are a lot of messages with images ready at the same time time.sleep(0.001) + + +class CacheSizeTask(BaseTask): + size = pyqtSignal(int) + + def task(self): + cache_dir = Cache().directory() + if os.path.exists(cache_dir): + cache_size_bytes = reduce(lambda x, f: x + os.path.getsize(f), glob.glob(os.path.join(cache_dir, "*")), 0) + self.size.emit(cache_size_bytes) + +class ClearCacheTask(BaseTask): + def task(self): + cache = Cache() + cache.clear() + \ No newline at end of file