Skip to content
This repository has been archived by the owner on Dec 31, 2023. It is now read-only.

Fix #392 with version check for Anki and Qt #396

Merged
merged 2 commits into from
Jul 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1619,7 +1619,7 @@ corresponding to when the API was available for use.

#### `guiImportFile`

* Invokes the *Import... (Ctrl+Shift+I)* dialog with an optional file path. Brings up the dialog for user to review the import. Supports all file types that Anki supports. Brings open file dialog if no path is provided. Forward slashes must be used in the path on Windows.
* Invokes the *Import... (Ctrl+Shift+I)* dialog with an optional file path. Brings up the dialog for user to review the import. Supports all file types that Anki supports. Brings open file dialog if no path is provided. Forward slashes must be used in the path on Windows. Only supported for Anki 2.1.52+.

<details>
<summary><i>Sample request:</i></summary>
Expand Down
33 changes: 24 additions & 9 deletions plugin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
from anki.importing import AnkiPackageImporter
from anki.notes import Note
from anki.errors import NotFoundError
from aqt.import_export.importing import import_file, prompt_for_file_then_import
from aqt.qt import Qt, QTimer, QMessageBox, QCheckBox

from .web import format_exception_reply, format_success_reply
Expand Down Expand Up @@ -1858,20 +1857,36 @@ def guiImportFile(self, path=None):
"""
Open Import File (Ctrl+Shift+I) dialog with provided file path.
If no path is given, the user will be prompted to select a file.
Only supported from Anki version >=2.1.52

path: string
import file path, note on Windows you must use forward slashes.
"""
if anki_version >= (2, 1, 52):
from aqt.import_export.importing import import_file, prompt_for_file_then_import
else:
raise Exception('guiImportFile is only supported from Anki version >=2.1.52')

if hasattr(Qt, 'WindowStaysOnTopHint'):
# Qt5
WindowOnTopFlag = Qt.WindowStaysOnTopHint
elif hasattr(Qt, 'WindowType') and hasattr(Qt.WindowType, 'WindowStaysOnTopHint'):
# Qt6
WindowOnTopFlag = Qt.WindowType.WindowStaysOnTopHint
else:
# Unsupported, don't try to bring window to top
WindowOnTopFlag = None

# Bring window to top for user to review import settings.
try:
# [Step 1/2] set always on top flag, show window (it stays on top for now)
self.window().setWindowFlags(self.window().windowFlags() | Qt.WindowStaysOnTopHint)
self.window().show()
finally:
# [Step 2/2] clear always on top flag, show window (it doesn't stay on top anymore)
self.window().setWindowFlags(self.window().windowFlags() & ~Qt.WindowStaysOnTopHint)
self.window().show()
if WindowOnTopFlag is not None:
try:
# [Step 1/2] set always on top flag, show window (it stays on top for now)
self.window().setWindowFlags(self.window().windowFlags() | WindowOnTopFlag)
self.window().show()
finally:
# [Step 2/2] clear always on top flag, show window (it doesn't stay on top anymore)
self.window().setWindowFlags(self.window().windowFlags() & ~WindowOnTopFlag)
self.window().show()

if path is None:
prompt_for_file_then_import(self.window())
Expand Down
8 changes: 6 additions & 2 deletions tests/test_graphical.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import pytest
from unittest import mock

from conftest import ac, wait_until, \
from conftest import ac, anki_version, wait_until, \
close_all_dialogs_and_wait_for_them_to_run_closing_callbacks, \
get_dialog_instance

Expand Down Expand Up @@ -29,7 +30,10 @@ def test_guiDeckOverview(setup):


def test_guiImportFile(setup):
ac.guiImportFile()
if anki_version >= (2, 1, 52):
with mock.patch('aqt.import_export.importing.prompt_for_file_then_import') as mock_prompt_for_file_then_import:
mock_prompt_for_file_then_import.return_value = True
ac.guiImportFile()


class TestAddCards:
Expand Down