From 3b30aa6413ebcc057d529a12d3dab39d1f3dd584 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sat, 27 Nov 2021 21:25:31 -0500 Subject: [PATCH 1/2] Save 'Check For Updates On Open' immediatly --- res/update_checker.ui | 28 ++++++++++++------------- src/AutoSplit.py | 20 +++++++----------- src/menu_bar.py | 49 ++++++++++++++++++++----------------------- src/resources_rc.py | 4 ++-- src/settings_file.py | 26 ++++++++++++++++++++++- src/update_checker.py | 18 ++++++++-------- 6 files changed, 80 insertions(+), 65 deletions(-) diff --git a/res/update_checker.ui b/res/update_checker.ui index 844d6d4f..2b5c96ee 100644 --- a/res/update_checker.ui +++ b/res/update_checker.ui @@ -45,9 +45,9 @@ - 17 + 20 10 - 281 + 218 16 @@ -58,13 +58,13 @@ - + There is an update available for AutoSplit. - 17 + 20 30 91 16 @@ -77,7 +77,7 @@ - 17 + 20 50 81 16 @@ -90,14 +90,14 @@ - 17 - 76 - 241 + 20 + 80 + 119 16 - + Open download page? @@ -113,7 +113,7 @@ Qt::NoFocus - + Open @@ -126,7 +126,7 @@ - + Later @@ -158,9 +158,9 @@ - 17 - 100 - 141 + 20 + 102 + 131 20 diff --git a/src/AutoSplit.py b/src/AutoSplit.py index 6bb0946e..5ec0728c 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -35,7 +35,8 @@ class AutoSplit(QtWidgets.QMainWindow, design.Ui_MainWindow): from hotkeys import send_command - from settings_file import saveSettings, saveSettingsAs, loadSettings, haveSettingsChanged, getSaveSettingsValues + from settings_file import saveSettings, saveSettingsAs, loadSettings, haveSettingsChanged, getSaveSettingsValues, \ + load_check_for_updates_on_open, set_check_for_updates_on_open from screen_region import selectRegion, selectWindow, alignRegion, validateBeforeComparison from hotkeys import afterSettingHotkey, beforeSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, \ setUndoSplitHotkey, setPauseHotkey @@ -56,10 +57,7 @@ def __init__(self, parent=None): super(AutoSplit, self).__init__(parent) self.setupUi(self) - #These are only global settings values. They are not *pkl settings values. - self.getGlobalSettingsValues() - check_for_updates_on_open = self.setting_check_for_updates_on_open.value('check_for_updates_on_open', True, type=bool) - self.actionCheck_for_Updates_on_Open.setChecked(check_for_updates_on_open) + self.load_check_for_updates_on_open() # Parse command line args self.is_auto_controlled = ('--auto-controlled' in sys.argv) @@ -155,6 +153,9 @@ def run(self): self.alignregionButton.clicked.connect(self.alignRegion) self.selectwindowButton.clicked.connect(self.selectWindow) self.startImageReloadButton.clicked.connect(lambda: self.loadStartImage(True, True)) + self.actionCheck_for_Updates_on_Open.changed.connect(lambda: self.set_check_for_updates_on_open( + self.actionCheck_for_Updates_on_Open.isChecked()) + ) # update x, y, width, and height when changing the value of these spinbox's are changed self.xSpinBox.valueChanged.connect(self.updateX) @@ -220,9 +221,6 @@ def run(self): # FUNCTIONS - def getGlobalSettingsValues(self): - self.setting_check_for_updates_on_open = QtCore.QSettings('AutoSplit', 'Check For Updates On Open') - # TODO add checkbox for going back to image 1 when resetting. def browse(self): # User selects the file with the split images in it. @@ -1144,10 +1142,6 @@ def updateSplitImage(self, custom_image_file: str = '', from_start_image: bool = # exit safely when closing the window def closeEvent(self, event: QtGui.QCloseEvent = None): - #save global setting values here - self.setting_check_for_updates_on_open.setValue('check_for_updates_on_open', - self.actionCheck_for_Updates_on_Open.isChecked()) - def exit(): if event is not None: event.accept() @@ -1197,7 +1191,7 @@ def main(): main_window = AutoSplit() main_window.show() if main_window.actionCheck_for_Updates_on_Open.isChecked(): - checkForUpdates(main_window, check_for_updates_on_open=True) + checkForUpdates(main_window, check_on_open=True) # Kickoff the event loop every so often so we can handle KeyboardInterrupt (^C) timer = QtCore.QTimer() diff --git a/src/menu_bar.py b/src/menu_bar.py index c8feca0b..73828236 100644 --- a/src/menu_bar.py +++ b/src/menu_bar.py @@ -8,17 +8,20 @@ import requests from packaging import version -import update_checker + +import about +import design import error_messages +import settings_file import resources_rc # noqa: F401 -from about import Ui_aboutAutoSplitWidget +import update_checker # AutoSplit Version number -VERSION = "1.6.0" +VERSION = "1.5.0" # About Window -class AboutWidget(QtWidgets.QWidget, Ui_aboutAutoSplitWidget): +class AboutWidget(QtWidgets.QWidget, about.Ui_aboutAutoSplitWidget): def __init__(self): super().__init__() self.setupUi(self) @@ -27,41 +30,36 @@ def __init__(self): self.versionLabel.setText(f"Version: {VERSION}") self.show() + class UpdateCheckerWidget(QtWidgets.QWidget, update_checker.Ui_UpdateChecker): - def __init__(self, latest_version: str, autosplit: AutoSplit, check_for_updates_on_open: bool = False): + def __init__(self, latest_version: str, design_window: design.Ui_MainWindow, check_on_open: bool = False): super().__init__() self.setupUi(self) self.labelCurrentVersionNumber.setText(VERSION) self.labelLatestVersionNumber.setText(latest_version) self.pushButtonLeft.clicked.connect(self.openUpdate) - self.pushButtonRight.clicked.connect(self.closeWindow) - self.autosplit = autosplit + self.checkBoxDoNotAskMeAgain.stateChanged.connect(self.doNotAskMeAgainStateChanged) + self.design_window = design_window if version.parse(latest_version) > version.parse(VERSION): - self.labelUpdateStatus.setText("There is an update available for AutoSplit.") - self.labelGoToDownload.setText("Open download page?") - self.pushButtonLeft.setVisible(True) - self.pushButtonLeft.setText("Open") - self.pushButtonRight.setText("Later") - if not check_for_updates_on_open: - self.checkBoxDoNotAskMeAgain.setVisible(False) + self.checkBoxDoNotAskMeAgain.setVisible(check_on_open) self.show() - elif not check_for_updates_on_open: + elif not check_on_open: self.labelUpdateStatus.setText("You are on the latest AutoSplit version.") + self.labelGoToDownload.setVisible(False) self.pushButtonLeft.setVisible(False) self.pushButtonRight.setText("OK") self.checkBoxDoNotAskMeAgain.setVisible(False) self.show() def openUpdate(self): - if self.checkBoxDoNotAskMeAgain.isChecked(): - self.autosplit.actionCheck_for_Updates_on_Open.setChecked(False) os.system("start \"\" https://github.com/Toufool/Auto-Split/releases/latest") self.close() - def closeWindow(self): - if self.checkBoxDoNotAskMeAgain.isChecked(): - self.autosplit.actionCheck_for_Updates_on_Open.setChecked(False) - self.close() + def doNotAskMeAgainStateChanged(self): + settings_file.set_check_for_updates_on_open( + self.design_window, + self.checkBoxDoNotAskMeAgain.isChecked()) + def viewHelp(): os.system("start \"\" https://github.com/Toufool/Auto-Split#tutorial") @@ -70,13 +68,12 @@ def viewHelp(): def about(self: AutoSplit): self.AboutWidget = AboutWidget() -def checkForUpdates(autosplit: AutoSplit, check_for_updates_on_open: bool = False): + +def checkForUpdates(autosplit: AutoSplit, check_on_open: bool = False): try: response = requests.get("https://api.github.com/repos/Toufool/Auto-Split/releases/latest") latest_version = response.json()["name"].split("v")[1] - autosplit.UpdateCheckerWidget = UpdateCheckerWidget(latest_version, autosplit, check_for_updates_on_open) + autosplit.UpdateCheckerWidget = UpdateCheckerWidget(latest_version, autosplit, check_on_open) except: - if not check_for_updates_on_open: + if not check_on_open: error_messages.checkForUpdatesError() - else: - pass diff --git a/src/resources_rc.py b/src/resources_rc.py index 4f7f7b54..826a7621 100644 --- a/src/resources_rc.py +++ b/src/resources_rc.py @@ -2297,9 +2297,9 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00D\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x91\ -\x00\x00\x01}N\xa9\xa5H\ +\x00\x00\x01}cp\x8e\xee\ \x00\x00\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01}N\xa9\xa5\x04\ +\x00\x00\x01}cp\x8eO\ " def qInitResources(): diff --git a/src/settings_file.py b/src/settings_file.py index 26f15b2d..29478587 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -4,13 +4,14 @@ from AutoSplit import AutoSplit from win32 import win32gui -from PyQt6 import QtWidgets +from PyQt6 import QtCore, QtWidgets import os import sys import keyboard import pickle from hotkeys import _hotkey_action +import design import error_messages # Get the directory of either AutoSplit.exe or AutoSplit.py @@ -308,3 +309,26 @@ def loadSettings(self: AutoSplit, load_settings_on_open: bool = False, load_sett self.last_successfully_loaded_settings_file_path = self.load_settings_file_path self.checkLiveImage() + + +def load_check_for_updates_on_open(designWindow: design.Ui_MainWindow): + """ + Retrieve the 'Check For Updates On Open' QSettings and set the checkbox state + These are only global settings values. They are not *pkl settings values. + """ + + value = QtCore \ + .QSettings('AutoSplit', 'Check For Updates On Open') \ + .value('check_for_updates_on_open', True, type=bool) + designWindow.actionCheck_for_Updates_on_Open.setChecked(value) + + +def set_check_for_updates_on_open(designWindow: design.Ui_MainWindow, value: bool): + """ + Sets the 'Check For Updates On Open' QSettings value and the checkbox state + """ + + designWindow.actionCheck_for_Updates_on_Open.setChecked(value) + QtCore \ + .QSettings('AutoSplit', 'Check For Updates On Open') \ + .setValue('check_for_updates_on_open', value) diff --git a/src/update_checker.py b/src/update_checker.py index 693b769b..0a8219d4 100644 --- a/src/update_checker.py +++ b/src/update_checker.py @@ -26,32 +26,28 @@ def setupUi(self, UpdateChecker): UpdateChecker.setFont(font) UpdateChecker.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.labelUpdateStatus = QtWidgets.QLabel(UpdateChecker) - self.labelUpdateStatus.setGeometry(QtCore.QRect(17, 10, 281, 16)) + self.labelUpdateStatus.setGeometry(QtCore.QRect(20, 10, 218, 16)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.labelUpdateStatus.sizePolicy().hasHeightForWidth()) self.labelUpdateStatus.setSizePolicy(sizePolicy) - self.labelUpdateStatus.setText("") self.labelUpdateStatus.setObjectName("labelUpdateStatus") self.labelCurrentVersion = QtWidgets.QLabel(UpdateChecker) - self.labelCurrentVersion.setGeometry(QtCore.QRect(17, 30, 91, 16)) + self.labelCurrentVersion.setGeometry(QtCore.QRect(20, 30, 91, 16)) self.labelCurrentVersion.setObjectName("labelCurrentVersion") self.labelLatestVersion = QtWidgets.QLabel(UpdateChecker) - self.labelLatestVersion.setGeometry(QtCore.QRect(17, 50, 81, 16)) + self.labelLatestVersion.setGeometry(QtCore.QRect(20, 50, 81, 16)) self.labelLatestVersion.setObjectName("labelLatestVersion") self.labelGoToDownload = QtWidgets.QLabel(UpdateChecker) - self.labelGoToDownload.setGeometry(QtCore.QRect(17, 76, 241, 16)) - self.labelGoToDownload.setText("") + self.labelGoToDownload.setGeometry(QtCore.QRect(20, 80, 119, 16)) self.labelGoToDownload.setObjectName("labelGoToDownload") self.pushButtonLeft = QtWidgets.QPushButton(UpdateChecker) self.pushButtonLeft.setGeometry(QtCore.QRect(150, 100, 75, 24)) self.pushButtonLeft.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.pushButtonLeft.setText("") self.pushButtonLeft.setObjectName("pushButtonLeft") self.pushButtonRight = QtWidgets.QPushButton(UpdateChecker) self.pushButtonRight.setGeometry(QtCore.QRect(230, 100, 75, 24)) - self.pushButtonRight.setText("") self.pushButtonRight.setObjectName("pushButtonRight") self.labelCurrentVersionNumber = QtWidgets.QLabel(UpdateChecker) self.labelCurrentVersionNumber.setGeometry(QtCore.QRect(120, 30, 181, 16)) @@ -62,7 +58,7 @@ def setupUi(self, UpdateChecker): self.labelLatestVersionNumber.setText("") self.labelLatestVersionNumber.setObjectName("labelLatestVersionNumber") self.checkBoxDoNotAskMeAgain = QtWidgets.QCheckBox(UpdateChecker) - self.checkBoxDoNotAskMeAgain.setGeometry(QtCore.QRect(17, 100, 141, 20)) + self.checkBoxDoNotAskMeAgain.setGeometry(QtCore.QRect(20, 102, 131, 20)) self.checkBoxDoNotAskMeAgain.setObjectName("checkBoxDoNotAskMeAgain") self.retranslateUi(UpdateChecker) @@ -72,6 +68,10 @@ def setupUi(self, UpdateChecker): def retranslateUi(self, UpdateChecker): _translate = QtCore.QCoreApplication.translate UpdateChecker.setWindowTitle(_translate("UpdateChecker", "Update Checker")) + self.labelUpdateStatus.setText(_translate("UpdateChecker", "There is an update available for AutoSplit.")) self.labelCurrentVersion.setText(_translate("UpdateChecker", "Current Version:")) self.labelLatestVersion.setText(_translate("UpdateChecker", "Latest Version:")) + self.labelGoToDownload.setText(_translate("UpdateChecker", "Open download page?")) + self.pushButtonLeft.setText(_translate("UpdateChecker", "Open")) + self.pushButtonRight.setText(_translate("UpdateChecker", "Later")) self.checkBoxDoNotAskMeAgain.setText(_translate("UpdateChecker", "Do not ask me again")) From 5c17bebb665507daaea1cbaf54d6ec381cde4d68 Mon Sep 17 00:00:00 2001 From: Avasam Date: Tue, 30 Nov 2021 12:04:36 -0500 Subject: [PATCH 2/2] Async check for updates --- .vscode/settings.json | 5 +---- scripts/requirements.txt | 2 +- src/AutoSplit.py | 5 ++++- src/menu_bar.py | 46 ++++++++++++++++++++++++++++------------ 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d8155e25..619e1800 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,7 +33,7 @@ // Maybe consider PyLint once all Flake8 linting is fixed "python.linting.pylintEnabled": false, "python.linting.flake8Enabled": true, - "python.linting.mypyEnabled": true, + "python.linting.mypyEnabled": false, // Flake8 is already a pycodestyle wrapper "python.linting.pycodestyleEnabled": false, "python.linting.pylintArgs": [ @@ -44,9 +44,6 @@ "python.linting.flake8Args": [ "--max-line-length=120" ], - "python.linting.mypyArgs": [ - "--max-line-length=120" - ], "python.formatting.autopep8Args": [ "--max-line-length=120" ], diff --git a/scripts/requirements.txt b/scripts/requirements.txt index fde89aff..46f9939b 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -20,8 +20,8 @@ packaging pyautogui PySide6 flake8 -mypy requests +types-requests # # Comment this out if you don't want to build AutoSplit.exe: PyInstaller diff --git a/src/AutoSplit.py b/src/AutoSplit.py index 5ec0728c..4d95bb41 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -15,7 +15,7 @@ import time from menu_bar import about, VERSION, viewHelp, checkForUpdates -from settings_file import auto_split_directory +from settings_file import auto_split_directory, open_update_checker from split_parser import BELOW_FLAG, DUMMY_FLAG, PAUSE_FLAG import capture_windows import compare @@ -52,6 +52,7 @@ class AutoSplit(QtWidgets.QMainWindow, design.Ui_MainWindow): undoSplitSignal = QtCore.pyqtSignal() pauseSignal = QtCore.pyqtSignal() afterSettingHotkeySignal = QtCore.pyqtSignal() + updateCheckerWidgetSignal = QtCore.pyqtSignal(str, bool) def __init__(self, parent=None): super(AutoSplit, self).__init__(parent) @@ -167,6 +168,8 @@ def run(self): self.updateCurrentSplitImage.connect(self.updateSplitImageGUI) self.afterSettingHotkeySignal.connect(self.afterSettingHotkey) self.startAutoSplitterSignal.connect(self.autoSplitter) + self.updateCheckerWidgetSignal.connect(lambda latest_version, check_on_open: + open_update_checker(self, latest_version, check_on_open)) self.resetSignal.connect(self.reset) self.skipSplitSignal.connect(self.skipSplit) self.undoSplitSignal.connect(self.undoSplit) diff --git a/src/menu_bar.py b/src/menu_bar.py index 73828236..69af8d3e 100644 --- a/src/menu_bar.py +++ b/src/menu_bar.py @@ -4,10 +4,13 @@ from AutoSplit import AutoSplit import os -from PyQt6 import QtWidgets -import requests from packaging import version +from PyQt6 import QtWidgets +from PyQt6.QtCore import QThread +from requests.exceptions import RequestException +from simplejson.errors import JSONDecodeError +import requests import about import design @@ -17,11 +20,11 @@ import update_checker # AutoSplit Version number -VERSION = "1.5.0" +VERSION = "1.6.1" # About Window -class AboutWidget(QtWidgets.QWidget, about.Ui_aboutAutoSplitWidget): +class __AboutWidget(QtWidgets.QWidget, about.Ui_aboutAutoSplitWidget): def __init__(self): super().__init__() self.setupUi(self) @@ -31,7 +34,11 @@ def __init__(self): self.show() -class UpdateCheckerWidget(QtWidgets.QWidget, update_checker.Ui_UpdateChecker): +def about(self: AutoSplit): + self.AboutWidget = __AboutWidget() + + +class __UpdateCheckerWidget(QtWidgets.QWidget, update_checker.Ui_UpdateChecker): def __init__(self, latest_version: str, design_window: design.Ui_MainWindow, check_on_open: bool = False): super().__init__() self.setupUi(self) @@ -61,19 +68,30 @@ def doNotAskMeAgainStateChanged(self): self.checkBoxDoNotAskMeAgain.isChecked()) +def open_update_checker(autosplit: AutoSplit, latest_version: str, check_on_open: bool): + autosplit.UpdateCheckerWidget = __UpdateCheckerWidget(latest_version, autosplit, check_on_open) + + def viewHelp(): os.system("start \"\" https://github.com/Toufool/Auto-Split#tutorial") -def about(self: AutoSplit): - self.AboutWidget = AboutWidget() +class __CheckForUpdatesThread(QThread): + def __init__(self, autosplit: AutoSplit, check_on_open: bool): + super().__init__() + self.autosplit = autosplit + self.check_on_open = check_on_open + + def run(self): + try: + response = requests.get("https://api.github.com/repos/Toufool/Auto-Split/releases/latest") + latest_version = response.json()["name"].split("v")[1] + self.autosplit.updateCheckerWidgetSignal.emit(latest_version, self.check_on_open) + except (RequestException, KeyError, JSONDecodeError): + if not self.check_on_open: + error_messages.checkForUpdatesError() def checkForUpdates(autosplit: AutoSplit, check_on_open: bool = False): - try: - response = requests.get("https://api.github.com/repos/Toufool/Auto-Split/releases/latest") - latest_version = response.json()["name"].split("v")[1] - autosplit.UpdateCheckerWidget = UpdateCheckerWidget(latest_version, autosplit, check_on_open) - except: - if not check_on_open: - error_messages.checkForUpdatesError() + autosplit.CheckForUpdatesThread = __CheckForUpdatesThread(autosplit, check_on_open) + autosplit.CheckForUpdatesThread.start()