diff --git a/ftl/core/browsing.ftl b/ftl/core/browsing.ftl
index 5ac5597ec..4253e155c 100644
--- a/ftl/core/browsing.ftl
+++ b/ftl/core/browsing.ftl
@@ -91,7 +91,7 @@ browsing-suspended = Suspended
browsing-tag-duplicates = Tag Duplicates
browsing-tag-rename-warning-empty = You can't rename a tag that has no notes.
browsing-target-field = Target field:
-browsing-toggle-showing-cards-notes = Toggle Showing Cards/Notes
+browsing-toggle-showing-cards-notes = Toggle Cards/Notes
browsing-toggle-mark = Toggle Mark
browsing-toggle-suspend = Toggle Suspend
browsing-treat-input-as-regular-expression = Treat input as regular expression
diff --git a/ftl/qt/qt-accel.ftl b/ftl/qt/qt-accel.ftl
index b34371101..199c77387 100644
--- a/ftl/qt/qt-accel.ftl
+++ b/ftl/qt/qt-accel.ftl
@@ -33,3 +33,10 @@ qt-accel-undo = &Undo
qt-accel-redo = &Redo
qt-accel-set-due-date = Set &Due Date...
qt-accel-forget = &Forget
+qt-accel-view = &View
+qt-accel-full-screen = Toggle &Full Screen
+qt-accel-zoom-in = Zoom &In
+qt-accel-zoom-out = Zoom &Out
+qt-accel-reset-zoom = &Reset Zoom
+qt-accel-zoom-editor-in = Zoom Editor &In
+qt-accel-zoom-editor-out = Zoom Editor &Out
diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py
index 25ef4ba8c..d6e51ac12 100644
--- a/qt/aqt/browser/browser.py
+++ b/qt/aqt/browser/browser.py
@@ -178,6 +178,7 @@ class Browser(QMainWindow):
def setupMenus(self) -> None:
# actions
f = self.form
+
# edit
qconnect(f.actionUndo.triggered, self.undo)
qconnect(f.actionRedo.triggered, self.redo)
@@ -187,6 +188,24 @@ class Browser(QMainWindow):
f.actionClose.setVisible(False)
qconnect(f.actionCreateFilteredDeck.triggered, self.createFilteredDeck)
f.actionCreateFilteredDeck.setShortcuts(["Ctrl+G", "Ctrl+Alt+G"])
+
+ # view
+ qconnect(f.actionFullScreen.triggered, self.mw.on_toggle_full_screen)
+ qconnect(
+ f.actionZoomIn.triggered,
+ lambda: self.editor.web.setZoomFactor(self.editor.web.zoomFactor() + 0.1),
+ )
+ f.actionZoomIn.setShortcut(QKeySequence.StandardKey.ZoomIn)
+ qconnect(
+ f.actionZoomOut.triggered,
+ lambda: self.editor.web.setZoomFactor(self.editor.web.zoomFactor() - 0.1),
+ )
+ f.actionZoomOut.setShortcut(QKeySequence.StandardKey.ZoomOut)
+ qconnect(
+ f.actionResetZoom.triggered,
+ lambda: self.editor.web.setZoomFactor(1),
+ )
+
# notes
qconnect(f.actionAdd.triggered, self.mw.onAddCard)
qconnect(f.actionCopy.triggered, self.on_create_copy)
@@ -199,6 +218,7 @@ class Browser(QMainWindow):
qconnect(f.actionFindReplace.triggered, self.onFindReplace)
qconnect(f.actionManage_Note_Types.triggered, self.mw.onNoteTypes)
qconnect(f.actionDelete.triggered, self.delete_selected_notes)
+
# cards
qconnect(f.actionChange_Deck.triggered, self.set_deck_of_selected_cards)
qconnect(f.action_Info.triggered, self.showCardInfo)
@@ -216,6 +236,7 @@ class Browser(QMainWindow):
)
self._update_flag_labels()
qconnect(f.actionExport.triggered, self._on_export_notes)
+
# jumps
qconnect(f.actionPreviousCard.triggered, self.onPreviousCard)
qconnect(f.actionNextCard.triggered, self.onNextCard)
@@ -225,13 +246,16 @@ class Browser(QMainWindow):
qconnect(f.actionNote.triggered, self.onNote)
qconnect(f.actionSidebar.triggered, self.focusSidebar)
qconnect(f.actionCardList.triggered, self.onCardList)
+
# help
qconnect(f.actionGuide.triggered, self.onHelp)
+
# keyboard shortcut for shift+home/end
self.pgUpCut = QShortcut(QKeySequence("Shift+Home"), self)
qconnect(self.pgUpCut.activated, self.onFirstCard)
self.pgDownCut = QShortcut(QKeySequence("Shift+End"), self)
qconnect(self.pgDownCut.activated, self.onLastCard)
+
# add-on hook
gui_hooks.browser_menus_did_init(self)
self.mw.maybeHideAccelerators(self)
diff --git a/qt/aqt/forms/browser.ui b/qt/aqt/forms/browser.ui
index 07fbd9bb3..6e1da64eb 100644
--- a/qt/aqt/forms/browser.ui
+++ b/qt/aqt/forms/browser.ui
@@ -219,8 +219,6 @@
-
-
@@ -300,7 +298,20 @@
+
+
@@ -665,6 +676,34 @@
Ctrl+Alt+E
+
+
+ qt_accel_full_screen
+
+
+
+
+ qt_accel_zoom_editor_in
+
+
+
+
+ qt_accel_zoom_editor_out
+
+
+
+
+ qt_accel_reset_zoom
+
+
+ Ctrl+0
+
+
+
+
+ browsing_toggle_showing_cards_notes
+
+
diff --git a/qt/aqt/forms/main.ui b/qt/aqt/forms/main.ui
index caa425933..5f7482d12 100644
--- a/qt/aqt/forms/main.ui
+++ b/qt/aqt/forms/main.ui
@@ -92,8 +92,19 @@
+
+
@@ -236,6 +247,29 @@
Ctrl+Shift+Z
+
+
+ qt_accel_full_screen
+
+
+
+
+ qt_accel_zoom_in
+
+
+
+
+ qt_accel_zoom_out
+
+
+
+
+ qt_accel_reset_zoom
+
+
+ Ctrl+0
+
+
diff --git a/qt/aqt/main.py b/qt/aqt/main.py
index 609d9aada..baf6a5e08 100644
--- a/qt/aqt/main.py
+++ b/qt/aqt/main.py
@@ -209,7 +209,6 @@ class AnkiQt(QMainWindow):
self.setup_timers()
self.updateTitleBar()
self.setup_focus()
- self.setup_shortcuts()
# screens
self.setupDeckBrowser()
self.setupOverview()
@@ -244,17 +243,6 @@ class AnkiQt(QMainWindow):
def on_focus_changed(self, old: QWidget, new: QWidget) -> None:
gui_hooks.focus_did_change(new, old)
- def setup_shortcuts(self) -> None:
- QShortcut(
- QKeySequence("Ctrl+Meta+F" if is_mac else "F11"),
- self,
- self.on_toggle_fullscreen,
- ).setContext(Qt.ShortcutContext.ApplicationShortcut)
-
- def on_toggle_fullscreen(self) -> None:
- window = self.app.activeWindow()
- window.setWindowState(window.windowState() ^ Qt.WindowState.WindowFullScreen)
-
# Profiles
##########################################################################
@@ -1277,28 +1265,62 @@ title="{}" {}>{}""".format(
def setupMenus(self) -> None:
m = self.form
+
+ # File
qconnect(
m.actionSwitchProfile.triggered, self.unloadProfileAndShowProfileManager
)
qconnect(m.actionImport.triggered, self.onImport)
qconnect(m.actionExport.triggered, self.onExport)
qconnect(m.actionExit.triggered, self.close)
- qconnect(m.actionPreferences.triggered, self.onPrefs)
- qconnect(m.actionAbout.triggered, self.onAbout)
- qconnect(m.actionUndo.triggered, self.undo)
- qconnect(m.actionRedo.triggered, self.redo)
- qconnect(m.actionFullDatabaseCheck.triggered, self.onCheckDB)
- qconnect(m.actionCheckMediaDatabase.triggered, self.on_check_media_db)
+
+ # Help
qconnect(m.actionDocumentation.triggered, self.onDocumentation)
qconnect(m.actionDonate.triggered, self.onDonate)
+ qconnect(m.actionAbout.triggered, self.onAbout)
+
+ # Edit
+ qconnect(m.actionUndo.triggered, self.undo)
+ qconnect(m.actionRedo.triggered, self.redo)
+
+ # Tools
+ qconnect(m.actionFullDatabaseCheck.triggered, self.onCheckDB)
+ qconnect(m.actionCheckMediaDatabase.triggered, self.on_check_media_db)
qconnect(m.actionStudyDeck.triggered, self.onStudyDeck)
qconnect(m.actionCreateFiltered.triggered, self.onCram)
qconnect(m.actionEmptyCards.triggered, self.onEmptyCards)
qconnect(m.actionNoteTypes.triggered, self.onNoteTypes)
+ qconnect(m.actionPreferences.triggered, self.onPrefs)
+
+ # View
+ qconnect(
+ m.actionZoomIn.triggered,
+ lambda: self.web.setZoomFactor(self.web.zoomFactor() + 0.1),
+ )
+ m.actionZoomIn.setShortcut(QKeySequence.StandardKey.ZoomIn)
+ qconnect(
+ m.actionZoomOut.triggered,
+ lambda: self.web.setZoomFactor(self.web.zoomFactor() - 0.1),
+ )
+ m.actionZoomOut.setShortcut(QKeySequence.StandardKey.ZoomOut)
+ qconnect(m.actionResetZoom.triggered, lambda: self.web.setZoomFactor(1))
+ # app-wide shortcut
+ qconnect(m.actionFullScreen.triggered, self.on_toggle_full_screen)
+ m.actionFullScreen.setShortcut(
+ QKeySequence("F11") if is_lin else QKeySequence.StandardKey.FullScreen
+ )
+ m.actionFullScreen.setShortcutContext(Qt.ShortcutContext.ApplicationShortcut)
def updateTitleBar(self) -> None:
self.setWindowTitle("Anki")
+ # View
+ ##########################################################################
+
+ def on_toggle_full_screen(self) -> None:
+ window = self.app.activeWindow()
+ window.setWindowState(window.windowState() ^ Qt.WindowState.WindowFullScreen)
+
# Auto update
##########################################################################
diff --git a/qt/aqt/webview.py b/qt/aqt/webview.py
index 0bde73a68..f80c33d04 100644
--- a/qt/aqt/webview.py
+++ b/qt/aqt/webview.py
@@ -358,7 +358,7 @@ class AnkiWebView(QWebEngineView):
self._domDone = False
super().load(url)
- def zoomFactor(self) -> float:
+ def app_zoom_factor(self) -> float:
# overridden scale factor?
webscale = os.environ.get("ANKI_WEBSCALE")
if webscale:
@@ -448,7 +448,7 @@ div[contenteditable="true"]:focus {{
color_hl_txt=color_hl_txt,
)
- zoom = self.zoomFactor()
+ zoom = self.app_zoom_factor()
window_bg_day = self.get_window_bg_color(False).name()
window_bg_night = self.get_window_bg_color(True).name()