From 7a8b4a193f9dac647208eddc3808fc1985c2a6fc Mon Sep 17 00:00:00 2001 From: Marvin Kopf Date: Fri, 30 May 2025 08:05:06 +0200 Subject: [PATCH 1/5] offload mpv callback registration to background thread to avoid UI blocking (#4038) Instantiating `MPV(MPVBase)` triggers multiple synchronous `command()` calls to the mpv process during callback registration. These calls block the main thread and degrade startup performance. This change defers registration via `taskman.run_in_background`. --- CONTRIBUTORS | 2 +- qt/aqt/mpv.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index e8814bf93..068760e6b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -230,7 +230,7 @@ KolbyML Adnane Taghi Spiritual Father Emmanuel Ferdman - +Marvin Kopf ******************** The text of the 3 clause BSD license follows: diff --git a/qt/aqt/mpv.py b/qt/aqt/mpv.py index 60ea21290..329a95538 100644 --- a/qt/aqt/mpv.py +++ b/qt/aqt/mpv.py @@ -41,6 +41,7 @@ import time from queue import Empty, Full, Queue from shutil import which +import aqt from anki.utils import is_mac, is_win @@ -444,7 +445,7 @@ class MPV(MPVBase): super().__init__(*args, **kwargs) - self._register_callbacks() + aqt.mw.taskman.run_in_background(self._register_callbacks, None) def _register_callbacks(self): self._callbacks = {} From 14b8a8ad0de381a86e44b409d334bedb90a4488c Mon Sep 17 00:00:00 2001 From: Abdo Date: Fri, 30 May 2025 09:05:36 +0300 Subject: [PATCH 2/5] Fix new card sort order not reacting to changes in gather order (#4039) --- ts/lib/components/EnumSelector.svelte | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/ts/lib/components/EnumSelector.svelte b/ts/lib/components/EnumSelector.svelte index 328946bd2..8a711e9c0 100644 --- a/ts/lib/components/EnumSelector.svelte +++ b/ts/lib/components/EnumSelector.svelte @@ -20,16 +20,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html export let disabledChoices: T[] = []; $: label = choices.find((c) => c.value === value)?.label; - - - From f9f089416225d1af2a10378552461505b0188058 Mon Sep 17 00:00:00 2001 From: llama Date: Fri, 30 May 2025 14:35:06 +0800 Subject: [PATCH 3/5] Add left margin to browser when sidebar is closed (#4040) * add left margin to browser when sidebar is closed * listen for event instead of explicit user action * refresh sidebar on visibility change * Add a margin on macOS even when not collapsed --------- Co-authored-by: Damien Elmes --- qt/aqt/browser/browser.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py index 260746514..49f289f93 100644 --- a/qt/aqt/browser/browser.py +++ b/qt/aqt/browser/browser.py @@ -53,6 +53,7 @@ from aqt.operations.tag import ( from aqt.qt import * from aqt.sound import av_player from aqt.switch import Switch +from aqt.theme import WidgetStyle from aqt.undo import UndoActionsInfo from aqt.utils import ( HelpPage, @@ -170,6 +171,7 @@ class Browser(QMainWindow): if self.height() != 0: self.aspect_ratio = self.width() / self.height() self.set_layout(self.mw.pm.browser_layout(), True) + self.onSidebarVisibilityChange(not self.sidebarDockWidget.isHidden()) # disable undo/redo self.on_undo_state_change(mw.undo_actions_info()) # legacy alias @@ -726,6 +728,7 @@ class Browser(QMainWindow): self.form.actionSidebarFilter.triggered, self.focusSidebarSearchBar, ) + qconnect(dw.visibilityChanged, self.onSidebarVisibilityChange) grid = QGridLayout() grid.addWidget(self.sidebar.searchBar, 0, 0) grid.addWidget(self.sidebar.toolbar, 0, 1) @@ -745,9 +748,17 @@ class Browser(QMainWindow): self.mw.progress.timer(10, self.sidebar.refresh, False, parent=self.sidebar) def showSidebar(self, show: bool = True) -> None: - want_visible = not self.sidebarDockWidget.isVisible() self.sidebarDockWidget.setVisible(show) - if want_visible and show: + + def onSidebarVisibilityChange(self, visible): + margins = self.form.verticalLayout_3.contentsMargins() + skip_left_margin = not visible and not ( + is_mac and aqt.mw.pm.get_widget_style() == WidgetStyle.NATIVE + ) + margins.setLeft(0 if skip_left_margin else margins.right()) + self.form.verticalLayout_3.setContentsMargins(margins) + + if visible: self.sidebar.refresh() def focusSidebar(self) -> None: From 6cdebd763815766dd8023664324a64f2229bd223 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Fri, 30 May 2025 22:48:31 +0700 Subject: [PATCH 4/5] Fix inverted margin logic https://github.com/ankitects/anki/pull/4040#issuecomment-2921626962 --- qt/aqt/browser/browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py index 49f289f93..fec163a1f 100644 --- a/qt/aqt/browser/browser.py +++ b/qt/aqt/browser/browser.py @@ -752,7 +752,7 @@ class Browser(QMainWindow): def onSidebarVisibilityChange(self, visible): margins = self.form.verticalLayout_3.contentsMargins() - skip_left_margin = not visible and not ( + skip_left_margin = visible and not ( is_mac and aqt.mw.pm.get_widget_style() == WidgetStyle.NATIVE ) margins.setLeft(0 if skip_left_margin else margins.right()) From 757247d424ed9b24a0fdd49f959fddbf5d35dde6 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sat, 31 May 2025 16:00:31 +0700 Subject: [PATCH 5/5] Use more secure API key https://github.com/ankitects/anki/pull/3925#discussion_r2051494659 --- qt/aqt/mediasrv.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/qt/aqt/mediasrv.py b/qt/aqt/mediasrv.py index cc7c4c2dd..a38790728 100644 --- a/qt/aqt/mediasrv.py +++ b/qt/aqt/mediasrv.py @@ -7,9 +7,8 @@ import enum import logging import mimetypes import os -import random import re -import string +import secrets import sys import threading import traceback @@ -765,7 +764,7 @@ def legacy_page_data() -> Response: return _text_response(HTTPStatus.NOT_FOUND, "page not found") -_APIKEY = "".join(random.choices(string.ascii_letters + string.digits, k=32)) +_APIKEY = secrets.token_urlsafe(32) def _have_api_access() -> bool: