Anki/qt/aqt/import_export/import_dialog.py
Damien Elmes 9f55cf26fc
Switch to SvelteKit (#3077)
* Update to latest Node LTS

* Add sveltekit

* Split tslib into separate @generated and @tslib components

SvelteKit's path aliases don't support multiple locations, so our old
approach of using @tslib to refer to both ts/lib and out/ts/lib will no
longer work. Instead, all generated sources and their includes are
placed in a separate out/ts/generated folder, and imported via @generated
instead. This also allows us to generate .ts files, instead of needing
to output separate .d.ts and .js files.

* Switch package.json to module type

* Avoid usage of baseUrl

Incompatible with SvelteKit

* Move sass into ts; use relative links

SvelteKit's default sass support doesn't allow overriding loadPaths

* jest->vitest, graphs example working with yarn dev

* most pages working in dev mode

* Some fixes after rebasing

* Fix/silence some svelte-check errors

* Get image-occlusion working with Fabric types

* Post-rebase lock changes

* Editor is now checked

* SvelteKit build integrated into ninja

* Use the new SvelteKit entrypoint for pages like congrats/deck options/etc

* Run eslint once for ts/**; fix some tests

* Fix a bunch of issues introduced when rebasing over latest main

* Run eslint fix

* Fix remaining eslint+pylint issues; tests now all pass

* Fix some issues with a clean build

* Latest bufbuild no longer requires @__PURE__ hack

* Add a few missed dependencies

* Add yarn.bat to fix Windows build

* Fix pages failing to show when ANKI_API_PORT not defined

* Fix svelte-check and vitest on Windows

* Set node path in ./yarn

* Move svelte-kit output to ts/.svelte-kit

Sadly, I couldn't figure out a way to store it in out/ if out/ is
a symlink, as it breaks module resolution when SvelteKit is run.

* Allow HMR inside Anki

* Skip SvelteKit build when HMR is defined

* Fix some post-rebase issues

I should have done a normal merge instead.
2024-03-31 09:16:31 +01:00

83 lines
2.4 KiB
Python

# 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 json
from dataclasses import dataclass
import aqt
import aqt.deckconf
import aqt.main
import aqt.operations
from aqt.qt import *
from aqt.utils import addCloseShortcut, disable_help_button, restoreGeom, saveGeom, tr
from aqt.webview import AnkiWebView, AnkiWebViewKind
@dataclass
class ImportArgs:
path: str
title = "importLog"
kind = AnkiWebViewKind.IMPORT_LOG
ts_page = "import-page"
def args_json(self) -> str:
return json.dumps(self.path)
class JsonFileArgs(ImportArgs):
def args_json(self) -> str:
return json.dumps(dict(type="json_file", path=self.path))
class CsvArgs(ImportArgs):
title = "csv import"
kind = AnkiWebViewKind.IMPORT_CSV
ts_page = "import-csv"
class AnkiPackageArgs(ImportArgs):
title = "anki package import"
kind = AnkiWebViewKind.IMPORT_ANKI_PACKAGE
ts_page = "import-anki-package"
class ImportDialog(QDialog):
DEFAULT_SIZE = (800, 600)
MIN_SIZE = (400, 300)
silentlyClose = True
def __init__(self, mw: aqt.main.AnkiQt, args: ImportArgs) -> None:
QDialog.__init__(self, mw, Qt.WindowType.Window)
self.mw = mw
self.args = args
self._setup_ui()
self.show()
def _setup_ui(self) -> None:
self.setWindowModality(Qt.WindowModality.ApplicationModal)
self.mw.garbage_collect_on_dialog_finish(self)
self.setMinimumSize(*self.MIN_SIZE)
disable_help_button(self)
restoreGeom(self, self.args.title, default_size=self.DEFAULT_SIZE)
addCloseShortcut(self)
self.web = AnkiWebView(kind=self.args.kind)
self.web.setVisible(False)
self.web.load_sveltekit_page(f"{self.args.ts_page}/{self.args.path}")
layout = QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.web)
self.setLayout(layout)
restoreGeom(self, self.args.title, default_size=(800, 800))
self.setWindowTitle(tr.decks_import_file())
def reject(self) -> None:
if self.mw.col and self.windowModality() == Qt.WindowModality.ApplicationModal:
self.mw.col.set_wants_abort()
self.web.cleanup()
self.web = None
saveGeom(self, self.args.title)
QDialog.reject(self)