mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 23:42:23 -04:00
Merge pull request #499 from glutanimate/add-custom-dialogs-to-dialogmanager
Allow add-on authors to register their dialogs with the dialog manager
This commit is contained in:
commit
bc435b8772
1 changed files with 34 additions and 6 deletions
|
@ -10,7 +10,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
import traceback
|
import traceback
|
||||||
from typing import Any, Optional
|
from typing import Any, Callable, Dict, Optional, Union
|
||||||
|
|
||||||
import anki.buildinfo
|
import anki.buildinfo
|
||||||
import anki.lang
|
import anki.lang
|
||||||
|
@ -69,7 +69,7 @@ from aqt import stats, about, preferences, mediasync # isort:skip
|
||||||
|
|
||||||
class DialogManager:
|
class DialogManager:
|
||||||
|
|
||||||
_dialogs = {
|
_dialogs: Dict[str, list] = {
|
||||||
"AddCards": [addcards.AddCards, None],
|
"AddCards": [addcards.AddCards, None],
|
||||||
"Browser": [browser.Browser, None],
|
"Browser": [browser.Browser, None],
|
||||||
"EditCurrent": [editcurrent.EditCurrent, None],
|
"EditCurrent": [editcurrent.EditCurrent, None],
|
||||||
|
@ -79,7 +79,7 @@ class DialogManager:
|
||||||
"sync_log": [mediasync.MediaSyncDialog, None],
|
"sync_log": [mediasync.MediaSyncDialog, None],
|
||||||
}
|
}
|
||||||
|
|
||||||
def open(self, name, *args):
|
def open(self, name: str, *args: Any) -> Any:
|
||||||
(creator, instance) = self._dialogs[name]
|
(creator, instance) = self._dialogs[name]
|
||||||
if instance:
|
if instance:
|
||||||
if instance.windowState() & Qt.WindowMinimized:
|
if instance.windowState() & Qt.WindowMinimized:
|
||||||
|
@ -94,17 +94,17 @@ class DialogManager:
|
||||||
self._dialogs[name][1] = instance
|
self._dialogs[name][1] = instance
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
def markClosed(self, name):
|
def markClosed(self, name: str):
|
||||||
self._dialogs[name] = [self._dialogs[name][0], None]
|
self._dialogs[name] = [self._dialogs[name][0], None]
|
||||||
|
|
||||||
def allClosed(self):
|
def allClosed(self):
|
||||||
return not any(x[1] for x in self._dialogs.values())
|
return not any(x[1] for x in self._dialogs.values())
|
||||||
|
|
||||||
def closeAll(self, onsuccess):
|
def closeAll(self, onsuccess: Callable[[], None]) -> Optional[bool]:
|
||||||
# can we close immediately?
|
# can we close immediately?
|
||||||
if self.allClosed():
|
if self.allClosed():
|
||||||
onsuccess()
|
onsuccess()
|
||||||
return
|
return None
|
||||||
|
|
||||||
# ask all windows to close and await a reply
|
# ask all windows to close and await a reply
|
||||||
for (name, (creator, instance)) in self._dialogs.items():
|
for (name, (creator, instance)) in self._dialogs.items():
|
||||||
|
@ -126,6 +126,34 @@ class DialogManager:
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def register_dialog(
|
||||||
|
self, name: str, creator: Union[Callable, type], instance: Optional[Any] = None
|
||||||
|
):
|
||||||
|
"""Allows add-ons to register a custom dialog to be managed by Anki's dialog
|
||||||
|
manager, which ensures that only one copy of the window is open at once,
|
||||||
|
and that the dialog cleans up asynchronously when the collection closes
|
||||||
|
|
||||||
|
Please note that dialogs added in this manner need to define a close behavior
|
||||||
|
by either:
|
||||||
|
|
||||||
|
- setting `dialog.silentlyClose = True` to have it close immediately
|
||||||
|
- define a `dialog.closeWithCallback()` method that is called when closed
|
||||||
|
by the dialog manager
|
||||||
|
|
||||||
|
TODO?: Implement more restrictive type check to ensure these requirements
|
||||||
|
are met
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
name {str} -- Name/identifier of the dialog in question
|
||||||
|
creator {Union[Callable, type]} -- A class or function to create new
|
||||||
|
dialog instances with
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
instance {Optional[Any]} -- An optional existing instance of the dialog
|
||||||
|
(default: {None})
|
||||||
|
"""
|
||||||
|
self._dialogs[name] = [creator, instance]
|
||||||
|
|
||||||
|
|
||||||
dialogs = DialogManager()
|
dialogs = DialogManager()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue