# Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from __future__ import annotations import functools from concurrent.futures import Future from typing import Callable import aqt import aqt.main from aqt.addons import ( AddonManager, DownloadLogEntry, install_or_update_addon, show_log_to_user, ) from aqt.qt import ( QDialog, QDialogButtonBox, QGridLayout, QLabel, QLineEdit, QPushButton, Qt, QVBoxLayout, QWidget, qconnect, ) from aqt.utils import disable_help_button, showWarning, tr def ankihub_login( mw: aqt.main.AnkiQt, on_success: Callable[[], None], username: str = "", password: str = "", ) -> None: def on_future_done(fut: Future[str], username: str, password: str) -> None: try: token = fut.result() except Exception as exc: showWarning(str(exc)) return if not token: showWarning(tr.sync_ankihub_login_failed(), parent=mw) ankihub_login(mw, on_success, username, password) return mw.pm.set_ankihub_token(token) mw.pm.set_ankihub_username(username) install_ankihub_addon(mw, mw.addonManager) on_success() def callback(username: str, password: str) -> None: if not username and not password: return if username and password: mw.taskman.with_progress( lambda: mw.col.ankihub_login(id=username, password=password), functools.partial(on_future_done, username=username, password=password), parent=mw, ) else: ankihub_login(mw, on_success, username, password) get_id_and_pass_from_user(mw, callback, username, password) def ankihub_logout( mw: aqt.main.AnkiQt, on_success: Callable[[], None], token: str, ) -> None: def logout() -> None: mw.pm.set_ankihub_username(None) mw.pm.set_ankihub_token(None) mw.col.ankihub_logout(token=token) mw.taskman.with_progress( logout, # We don't need to wait for the response lambda _: on_success(), parent=mw, ) def get_id_and_pass_from_user( mw: aqt.main.AnkiQt, callback: Callable[[str, str], None], username: str = "", password: str = "", ) -> None: diag = QDialog(mw) diag.setWindowTitle("Anki") disable_help_button(diag) diag.setWindowModality(Qt.WindowModality.WindowModal) diag.setMinimumWidth(600) vbox = QVBoxLayout() info_label = QLabel(f"