diff --git a/qt/aqt/addons.py b/qt/aqt/addons.py index 6d692626d..472419556 100644 --- a/qt/aqt/addons.py +++ b/qt/aqt/addons.py @@ -726,6 +726,7 @@ class AddonsDialog(QDialog): def __init__(self, addonsManager: AddonManager) -> None: self.mgr = addonsManager self.mw = addonsManager.mw + self._require_restart = False super().__init__(self.mw) @@ -768,6 +769,8 @@ class AddonsDialog(QDialog): self.onInstallFiles(paths) def reject(self) -> None: + if self._require_restart: + tooltip(tr.addons_changes_will_take_effect_when_anki(), parent=self.mw) saveGeom(self, "addons") aqt.dialogs.markClosed("AddonsDialog") @@ -854,6 +857,7 @@ class AddonsDialog(QDialog): def onToggleEnabled(self) -> None: for module in self.selectedAddons(): self.mgr.toggleEnabled(module) + self._require_restart = True self.redrawAddons() def onViewPage(self) -> None: @@ -885,6 +889,9 @@ class AddonsDialog(QDialog): return gui_hooks.addons_dialog_will_delete_addons(self, selected) for module in selected: + # doing this before deleting, as `enabled` is always True afterwards + if self.mgr.addon_meta(module).enabled: + self._require_restart = True if not self.mgr.deleteAddon(module): break self.form.addonList.clearSelection() diff --git a/qt/aqt/main.py b/qt/aqt/main.py index 184e028cd..32004b81c 100644 --- a/qt/aqt/main.py +++ b/qt/aqt/main.py @@ -31,7 +31,16 @@ from anki.decks import DeckDict, DeckId from anki.hooks import runHook from anki.notes import NoteId from anki.sound import AVTag, SoundOrVideoTag -from anki.utils import dev_mode, ids2str, int_time, is_lin, is_mac, is_win, split_fields +from anki.utils import ( + dev_mode, + ids2str, + int_time, + is_lin, + is_mac, + is_win, + point_version, + split_fields, +) from aqt import gui_hooks from aqt.addons import DownloadLogEntry, check_and_prompt_for_updates, show_log_to_user from aqt.dbcheck import check_db @@ -713,7 +722,6 @@ class AnkiQt(QMainWindow): gui_hooks.state_did_change(state, oldState) def _deckBrowserState(self, oldState: str) -> None: - self.maybe_check_for_addon_updates() self.deckBrowser.show() def _selectedDeck(self) -> DeckDict | None: @@ -933,7 +941,7 @@ title="{}" {}>{}""".format( last_check = self.pm.last_addon_update_check() elap = int_time() - last_check - if elap > 86_400: + if elap > 86_400 or self.pm.last_run_version() != point_version(): check_and_prompt_for_updates( self, self.addonManager, @@ -1112,6 +1120,7 @@ title="{}" {}>{}""".format( ########################################################################## def closeEvent(self, event: QCloseEvent) -> None: + self.pm.set_last_run_version() if self.state == "profileManager": # if profile manager active, this event may fire via OS X menu bar's # quit option diff --git a/qt/aqt/profiles.py b/qt/aqt/profiles.py index 07c86ec6e..e4756c231 100644 --- a/qt/aqt/profiles.py +++ b/qt/aqt/profiles.py @@ -20,7 +20,7 @@ from anki.collection import Collection from anki.db import DB from anki.lang import without_unicode_isolation from anki.sync import SyncAuth -from anki.utils import int_time, is_mac, is_win +from anki.utils import int_time, is_mac, is_win, point_version from aqt import appHelpSite from aqt.qt import * from aqt.theme import Theme @@ -499,6 +499,12 @@ create table if not exists profiles # Shared options ###################################################################### + def last_run_version(self) -> int: + return self.meta.get("last_run_version", 0) + + def set_last_run_version(self) -> None: + self.meta["last_run_version"] = point_version() + def uiScale(self) -> float: scale = self.meta.get("uiScale", 1.0) return max(scale, 1)