Skip to content

Commit

Permalink
v1.1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
ccz-2 committed Mar 10, 2020
1 parent 28a1ad2 commit c2e684e
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 94 deletions.
184 changes: 95 additions & 89 deletions __init__.py
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
Expand All @@ -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()
10 changes: 5 additions & 5 deletions config.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
### Anki Zoom v1.1.1 Config:
All config is effective immediately
### Anki Zoom v1.1.2 Config:
All config is effective immediately. If having issues, please click "Restore Defaults".

- `deckBrowser_zoom_default`: Zoom level that the reset button applies for the deck browser
- `deckBrowser_zoom_default`: Zoom level that the reset button applies for the deck browser. Must be >`0.2` and <`5`

- `overview_zoom_default`: Zoom level that the reset button applies for the overview screen (screen after selecting a deck)
- `overview_zoom_default`: Zoom level that the reset button applies for the overview screen (screen after selecting a deck). Must be >`0.2` and <`5`

- `review_zoom_default`: Zoom level that the reset button applies for card reviews
- `review_zoom_default`: Zoom level that the reset button applies for card reviews. Must be >`0.2` and <`5`

- `zoom_step`: How much is zoom is applied per step.
Values are a percentage: e.g. `1.1` = 110% scaling on zoom in, (1/1.1)≈91% scaling on zoom out
Expand Down
Binary file modified zoom.ankiaddon
Binary file not shown.

0 comments on commit c2e684e

Please sign in to comment.