-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
100 additions
and
94 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
# Anki Zoom | ||
# v1.1.1 3/2/2020 | ||
# Copyright © 2020 Quip13 ([email protected]) | ||
# v1.1.2 3/8/2020 | ||
# Copyright (c) 2020 Quip13 ([email protected]) | ||
# Based in part on code by Damien Elmes <[email protected]>, Roland Sieker <[email protected]> and github.com/krassowski | ||
# Big thanks to u/Glutanimate and u/yumenogotoshi for code suggestions | ||
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html | ||
|
@@ -13,114 +13,120 @@ | |
from anki.hooks import * | ||
from anki.lang import _ | ||
|
||
config = mw.addonManager.getConfig(__name__) | ||
zoom_step = config[ 'zoom_step' ] | ||
def configUpdated(*args): | ||
global scrl_threshold | ||
global zoom_step | ||
global config | ||
config = mw.addonManager.getConfig(__name__) #can be moved out of func for performance but config will not update automatically | ||
scrl_threshold = config[ 'scroll_sensitivity' ] | ||
zoom_step = config[ 'zoom_step' ] | ||
|
||
configUpdated() | ||
mw.addonManager.setConfigUpdatedAction(__name__, configUpdated) | ||
|
||
def zoom_in(step=None): | ||
if not step: | ||
step = zoom_step | ||
change_zoom_by(step) | ||
if not step: | ||
step = zoom_step | ||
change_zoom_by(step) | ||
|
||
def zoom_out(step=None): | ||
if not step: | ||
step = zoom_step | ||
change_zoom_by(1 / step) | ||
if not step: | ||
step = zoom_step | ||
change_zoom_by(1 / step) | ||
|
||
def reset_zoom(state=None, *args): | ||
config = mw.addonManager.getConfig(__name__) | ||
if not state: | ||
state = mw.state | ||
if state == 'deckBrowser': | ||
change_zoom( config[ 'deckBrowser_zoom_default' ] ) | ||
if state == 'overview': | ||
change_zoom( config[ 'overview_zoom_default' ] ) | ||
elif state == 'review': | ||
change_zoom( config[ 'review_zoom_default' ] ) | ||
if not state: | ||
state = mw.state | ||
if state == 'deckBrowser': | ||
change_zoom( config[ 'deckBrowser_zoom_default' ] ) | ||
if state == 'overview': | ||
change_zoom( config[ 'overview_zoom_default' ] ) | ||
elif state == 'review': | ||
change_zoom( config[ 'review_zoom_default' ] ) | ||
|
||
def change_zoom_by(interval): | ||
currZoom = QWebEngineView.zoomFactor(mw.web) | ||
change_zoom(currZoom * interval) | ||
currZoom = QWebEngineView.zoomFactor(mw.web) #use non-overridden method | ||
change_zoom(currZoom * interval) | ||
|
||
def change_zoom(zoom_lvl): | ||
mw.web.setZoomFactor(zoom_lvl) | ||
mw.web.setZoomFactor(zoom_lvl) | ||
|
||
def set_save_zoom(new_state, old_state, *args): | ||
if old_state == new_state: #skips if reset | ||
return | ||
def unpause(): | ||
mw.setUpdatesEnabled(True) | ||
old_state_zoom = QWebEngineView.zoomFactor(mw.web) | ||
mw.setUpdatesEnabled(False) | ||
config = mw.addonManager.getConfig(__name__) | ||
|
||
if old_state == 'deckBrowser': | ||
config[ 'deckBrowser_zoom' ] = old_state_zoom | ||
elif old_state == 'overview': | ||
config[ 'overview_zoom' ] = old_state_zoom | ||
elif old_state == 'review': | ||
config[ 'review_zoom' ] = old_state_zoom | ||
mw.addonManager.writeConfig(__name__, config) | ||
|
||
config = mw.addonManager.getConfig(__name__) | ||
if new_state == 'deckBrowser': | ||
change_zoom( config[ 'deckBrowser_zoom' ] ) | ||
elif new_state == 'overview': | ||
change_zoom( config[ 'overview_zoom' ] ) | ||
elif new_state == 'review': | ||
change_zoom( config[ 'review_zoom' ] ) | ||
|
||
QTimer.singleShot(150, unpause) #prevents flickering | ||
if old_state == new_state: #skips if reset | ||
return | ||
|
||
#Saves state zoom | ||
old_state_zoom = QWebEngineView.zoomFactor(mw.web) | ||
if old_state == 'deckBrowser': | ||
config[ 'deckBrowser_zoom' ] = old_state_zoom | ||
elif old_state == 'overview': | ||
config[ 'overview_zoom' ] = old_state_zoom | ||
elif old_state == 'review': | ||
config[ 'review_zoom' ] = old_state_zoom | ||
mw.addonManager.writeConfig(__name__, config) | ||
|
||
|
||
mw.setUpdatesEnabled(False) #prevents flickering | ||
|
||
#Applies state zoom | ||
if new_state == 'deckBrowser': | ||
change_zoom( config[ 'deckBrowser_zoom' ] ) | ||
elif new_state == 'overview': | ||
change_zoom( config[ 'overview_zoom' ] ) | ||
elif new_state == 'review': | ||
change_zoom( config[ 'review_zoom' ] ) | ||
|
||
def unpause(): | ||
mw.setUpdatesEnabled(True) | ||
QTimer.singleShot(150, unpause) #prevents flickering | ||
|
||
numDeg = 0 | ||
def AnkiWebView_eventFilter_wrapper(self, obj, event): | ||
global numDeg | ||
global zoom_step | ||
|
||
config = mw.addonManager.getConfig(__name__) #can be moved out of func for performance but config will not update automatically | ||
scrl_threshold = config[ 'scroll_sensitivity' ] | ||
zoom_step = config[ 'zoom_step' ] | ||
|
||
if (mw.app.keyboardModifiers() == Qt.ControlModifier and | ||
event.type() == QEvent.Wheel): | ||
numDeg = numDeg + event.angleDelta().y() | ||
if numDeg > scrl_threshold: | ||
zoom_in() | ||
numDeg = 0 | ||
elif numDeg < -scrl_threshold : | ||
zoom_out() | ||
numDeg = 0 | ||
global numDeg | ||
if (mw.app.keyboardModifiers() == Qt.ControlModifier and | ||
event.type() == QEvent.Wheel): | ||
numDeg = numDeg + event.angleDelta().y() | ||
if numDeg >= scrl_threshold: | ||
zoom_in() | ||
numDeg = 0 | ||
elif numDeg <= -scrl_threshold : | ||
zoom_out() | ||
numDeg = 0 | ||
|
||
AnkiWebView.eventFilter = wrap(AnkiWebView.eventFilter, AnkiWebView_eventFilter_wrapper, 'before') | ||
|
||
def add_action(submenu, label, callback, shortcut=None): | ||
action = QAction(_(label), mw) | ||
action.triggered.connect(callback) | ||
if shortcut: | ||
shortcutList= [] | ||
for i in shortcut: | ||
shortcutList.append(QKeySequence(i)) | ||
action.setShortcuts(shortcutList) | ||
submenu.addAction(action) | ||
return action | ||
action = QAction(_(label), mw) | ||
action.triggered.connect(callback) | ||
if shortcut: | ||
shortcutList= [] | ||
for i in shortcut: | ||
shortcutList.append(QKeySequence(i)) | ||
action.setShortcuts(shortcutList) | ||
submenu.addAction(action) | ||
return action | ||
|
||
def setup_menu(): | ||
try: | ||
mw.addon_view_menu | ||
except AttributeError: | ||
mw.addon_view_menu = QMenu(_('&View'), mw) | ||
mw.form.menubar.insertMenu( | ||
mw.form.menuTools.menuAction(), | ||
mw.addon_view_menu | ||
) | ||
|
||
mw.zoom_submenu = QMenu(_('&Zoom'), mw) | ||
mw.addon_view_menu.addMenu(mw.zoom_submenu) | ||
|
||
add_action(mw.zoom_submenu, 'Zoom &In', zoom_in, ['Ctrl++','Ctrl+=']) | ||
add_action(mw.zoom_submenu, 'Zoom &Out', zoom_out, ['Ctrl+-']) | ||
mw.zoom_submenu.addSeparator() | ||
add_action(mw.zoom_submenu, '&Reset', reset_zoom, ['Ctrl+0']) | ||
try: | ||
mw.addon_view_menu | ||
except AttributeError: | ||
mw.addon_view_menu = QMenu(_('&View'), mw) | ||
mw.form.menubar.insertMenu( | ||
mw.form.menuTools.menuAction(), | ||
mw.addon_view_menu | ||
) | ||
|
||
mw.zoom_submenu = QMenu(_('&Zoom'), mw) | ||
mw.addon_view_menu.addMenu(mw.zoom_submenu) | ||
|
||
add_action(mw.zoom_submenu, 'Zoom &In', zoom_in, ['Ctrl++','Ctrl+=']) | ||
add_action(mw.zoom_submenu, 'Zoom &Out', zoom_out, ['Ctrl+-']) | ||
mw.zoom_submenu.addSeparator() | ||
add_action(mw.zoom_submenu, '&Reset', reset_zoom, ['Ctrl+0']) | ||
|
||
def onClose(): | ||
set_save_zoom(None,mw.state) | ||
|
||
addHook("afterStateChange", set_save_zoom) | ||
|
||
addHook("unloadProfile", onClose) | ||
setup_menu() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.